package com.thomasdh.roosterpgplus.Helpers;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import com.thomasdh.roosterpgplus.Helpers.Apache.UrlEncodedFormEntity;
import com.thomasdh.roosterpgplus.Settings.Constants;
import java.net.URL;
import java.util.Scanner;
import javax.net.ssl.HttpsURLConnection;
public class InternetConnection {
public static boolean isToastTriggered = false;
public static void post(String url, RequestCallbacks callbacks, Context context) {
new WebTask(context).execute(new InternetCallbacks() {
@Override
public HttpsURLConnection onAsynchronous(HttpsURLConnection connection) throws Exception {
connection = (HttpsURLConnection) new URL(url).openConnection();
connection.addRequestProperty("APIVersion", Constants.API_VERSION);
UrlEncodedFormEntity data = callbacks.onDataNeeded();
connection.setDoOutput(true);
connection.setConnectTimeout(Constants.TIMEOUT_MILLIS);
connection.setFixedLengthStreamingMode((int) data.getContentLength());
data.writeTo(connection.getOutputStream());
return connection;
}
@Override
public String onValidateResponse(String data, int status) throws Exception {
return callbacks.onValidateResponse(data, status);
}
@Override
public void onProcessData(String data) {
callbacks.onProcessData(data);
}
@Override
public void onError(Exception e) {
callbacks.onError(e);
}
});
}
public static void get(String url, RequestCallbacks callbacks, Context context) {
new WebTask(context).execute(new InternetCallbacks() {
@Override
public HttpsURLConnection onAsynchronous(HttpsURLConnection connection) throws Exception {
connection = (HttpsURLConnection) new URL(url).openConnection();
connection.addRequestProperty("APIVersion", Constants.API_VERSION);
return connection;
}
@Override
public String onValidateResponse(String data, int status) throws Exception {
return callbacks.onValidateResponse(data, status);
}
@Override
public void onProcessData(String data) {
callbacks.onProcessData(data);
}
@Override
public void onError(Exception e) {
callbacks.onError(e);
}
});
}
private static class WebTask extends AsyncTask<InternetCallbacks, Exception, String> {
private Context context;
private InternetCallbacks callbacks;
private boolean hasNewAPIVersion;
private WebTask(Context context) {
this.context = context;
}
@Override
protected String doInBackground(InternetCallbacks... params) {
callbacks = params[0];
if(!HelperFunctions.hasInternetConnection(context)) {
publishProgress(new Exception("Geen internetverbinding"));
return null;
}
try {
HttpsURLConnection connection = callbacks.onAsynchronous(null);
String content = "";
try {
Scanner scanner = new Scanner(connection.getInputStream());
while(scanner.hasNext()) {
content += scanner.nextLine();
}
} catch(Exception e) {
// no content
} finally {
connection.disconnect();
}
hasNewAPIVersion = connection.getHeaderField("CurrentAPIVersion") != null;
return callbacks.onValidateResponse(content, connection.getResponseCode());
} catch(Exception e) {
publishProgress(e);
}
return null;
}
@Override
protected void onPostExecute(String o) {
if(hasNewAPIVersion && !isToastTriggered) {
/* Show warning */
Toast.makeText(context, "Er is een nieuwe versie van de app beschikbaar!", Toast.LENGTH_LONG).show();
isToastTriggered = true;
}
callbacks.onProcessData(o);
}
@Override
protected void onProgressUpdate(Exception... values) {
Exception exception = values[0];
callbacks.onError(exception);
cancel(true);
}
}
private interface InternetCallbacks {
HttpsURLConnection onAsynchronous(HttpsURLConnection connection) throws Exception;
String onValidateResponse(String data, int status) throws Exception;
void onProcessData(String data);
void onError(Exception e);
}
public interface RequestCallbacks {
UrlEncodedFormEntity onDataNeeded() throws Exception;
String onValidateResponse(String data, int status) throws Exception;
void onProcessData(String data);
void onError(Exception e);
}
}