package co.mwater.clientapp.db;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import co.mwater.clientapp.dbsync.RESTClient;
import co.mwater.clientapp.dbsync.RESTClientException;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class SourceCodes {
private static final String PREF_NAMES = "SourceCodes";
private static final String AVAILABLE_CODES = "AvailableCodes";
private static final int minCodes = 5;
public static String obtainCode(Context context) throws NoMoreCodesException {
// Get available codes string
SharedPreferences prefs = context.getSharedPreferences(PREF_NAMES, Context.MODE_PRIVATE);
List<String> availableCodes = PreferenceUtils.stringToList(prefs.getString(AVAILABLE_CODES, ""));
// Take first one
if (availableCodes.size() == 0)
throw new NoMoreCodesException();
String code = availableCodes.remove(0);
Editor editor = prefs.edit();
editor.putString(AVAILABLE_CODES, PreferenceUtils.listToString(availableCodes));
editor.commit();
return code;
}
public static boolean anyCodesAvailable(Context context) {
// Get available codes string
SharedPreferences prefs = context.getSharedPreferences(PREF_NAMES, Context.MODE_PRIVATE);
List<String> availableCodes = PreferenceUtils.stringToList(prefs.getString(AVAILABLE_CODES, ""));
return availableCodes.size() > 0;
}
public static boolean newCodesNeeded(Context context) {
// Get available codes string
SharedPreferences prefs = context.getSharedPreferences(PREF_NAMES, Context.MODE_PRIVATE);
List<String> availableCodes = PreferenceUtils.stringToList(prefs.getString(AVAILABLE_CODES, ""));
return availableCodes.size() < minCodes;
}
public static boolean requestNewCodesIfNeeded(Context context) {
while (newCodesNeeded(context))
if (!requestNewCodes(context))
return false;
return true;
}
private static boolean requestNewCodes(Context context) {
RESTClient restClient = MWaterServer.createClient(context);
try {
String codesjson = restClient.get("requestcodes",
"clientuid", MWaterServer.getClientUid(context));
JSONArray arr = new JSONArray(codesjson);
// Get available codes string
SharedPreferences prefs = context.getSharedPreferences(PREF_NAMES, Context.MODE_PRIVATE);
List<String> availableCodes = PreferenceUtils.stringToList(prefs.getString(AVAILABLE_CODES, ""));
// Add new codes
for (int i = 0; i < arr.length(); i++)
availableCodes.add(arr.getString(i));
// Save codes
Editor editor = prefs.edit();
editor.putString(AVAILABLE_CODES, PreferenceUtils.listToString(availableCodes));
editor.commit();
return true;
} catch (RESTClientException e) {
return false;
} catch (JSONException e) {
return false;
}
}
public static class NoMoreCodesException extends Exception {
private static final long serialVersionUID = -4836074561313007370L;
}
}