package org.smartpaws.net;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.preference.PreferenceManager;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.squareup.picasso.NetworkPolicy;
import org.apache.http.Header;
import org.smartpaws.MainActivity;
import org.smartpaws.db.DBMS;
import org.smartpaws.objects.Convention;
import java.nio.channels.NotYetConnectedException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static org.smartpaws.MainActivity.APP_NAME;
public class DataMan {
private static final DBMS DATABASE = new DBMS(MainActivity.INSTANCE);
public static final Gson GSON = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").serializeNulls().create();
public static final Gson GSON_TWITTER = new GsonBuilder()
.setDateFormat("EEE MMM dd HH:mm:ss ZZZZZ yyyy").create();
private static final Map<String, Convention> conventions = new ConcurrentHashMap<>();
public static DBMS getDatabase() {
return DATABASE;
}
public static String getSelectedConvention(Context context) {
try {
return PreferenceManager.getDefaultSharedPreferences(context).getString("smartpaws.selected_convention", "confuzzled").toLowerCase();
} catch (Exception ex) {
return "confuzzled";
}
}
public static void getConvention(final String name, final ResponseHandler<Convention> response) throws NotYetConnectedException {
Convention result = conventions.get(name);
if (result != null) {
response.result(result);
return;
}
NetworkInfo.State state = isNetworkConnected();
if (state.equals(NetworkInfo.State.DISCONNECTED) || state.equals(NetworkInfo.State.DISCONNECTING)) {
result = DATABASE.getConvention(name);
if (result != null) {
conventions.put(name, result);
response.result(result);
return;
}
response.result(null);
}
HttpClient.get(name + ".json", null, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
try {
Convention convention = GSON.fromJson(new String(responseBody, "UTF-8"), Convention.class);
conventions.put(name, convention);
DATABASE.setConvention(name, convention);
response.result(convention);
} catch (Exception ex) {
Log.e(APP_NAME, "", ex);
}
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e(APP_NAME, "HTTP Error: " + statusCode + "\nURL:" + "img/" + name + ".json", error);
}
});
}
/**
* Get a single image
*
* @param name
* @param extension
* @param response
*
* @deprecated Use Picasso library
*/
@Deprecated
public static void getImage(final String name, final String extension, final ResponseHandler<Bitmap> response) {
HttpClient.get("img/" + name + extension, null, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
response.result(BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e(APP_NAME, "HTTP Error: " + statusCode + "\nURL:" + "img/" + name + extension, error);
}
});
}
public static void getByteArray(final String name, final String extension, final ResponseHandler<byte[]> response) {
HttpClient.get(name + extension, null, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
response.result(responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e(APP_NAME, "HTTP Error: " + statusCode + "\nURL:" + name + extension, error);
}
});
}
/**
*
* Get an image parallel to other image HTTP requests
*
* @param index
* @param name
* @param extension
* @param response
*
* @deprecated Use Picasso library
*/
@Deprecated
public static void getParallelByteArray(final int index, final String name, final String extension, final ParallelResponseHandler<byte[]> response) {
HttpClient.get(name + extension, null, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
response.result(index, responseBody);
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e(APP_NAME, "HTTP Error: " + statusCode + "\nURL:" + "img/" + name + extension, error);
}
});
}
/**
* Get an externally sourced image (eg. Twitter profile picture) by using a ResponseHandler
*
* @param url the URL
* @param response ResponseHandler for this image
*
* @deprecated Use Picasso library
*/
@Deprecated
public static void getExternalImage(final String url, final ResponseHandler<Bitmap> response) {
HttpClient.getExternalUrl(url, null, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
response.result(BitmapFactory.decodeByteArray(responseBody, 0, responseBody.length));
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
Log.e(APP_NAME, "HTTP Error: " + statusCode + "\nURL:" + url, error);
}
});
}
public static NetworkInfo.State isNetworkConnected() {
ConnectivityManager cm = (ConnectivityManager) MainActivity.INSTANCE.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
return NetworkInfo.State.DISCONNECTED;
} else {
return ni.getState();
}
}
public static NetworkPolicy getNetworkPolicy() {
NetworkInfo.State state = DataMan.isNetworkConnected();
return (state.equals(NetworkInfo.State.DISCONNECTED) || state.equals(NetworkInfo.State.DISCONNECTING) ? NetworkPolicy.OFFLINE : NetworkPolicy.NO_CACHE);
}
}