diff --git a/app/build.gradle b/app/build.gradle index 1ab9b5a..d9c648a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,4 +45,5 @@ dependencies { implementation "androidx.camera:camera-view:1.0.0-alpha14" implementation 'com.google.zxing:core:3.3.0' implementation 'com.android.volley:volley:1.2.0' + implementation 'com.google.code.gson:gson:2.8.6' } \ No newline at end of file diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/util/APIv1.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/APIv1.java new file mode 100644 index 0000000..41ae6d0 --- /dev/null +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/APIv1.java @@ -0,0 +1,25 @@ +package dev.garrettmills.starship.hyperlink.util; + +import dev.garrettmills.starship.hyperlink.Hyperlink; + +public class APIv1 { + /** + * Given an API endpoint, resolve the fully qualified URL using the stored server address. + * Example: + * resolveEndpoint("/auth/redeem") // => "https://hyperlink.url/api/v1/auth/redeem" + * @param endpoint un-qualified api endpoint + * @return The resolved string. + */ + public static String resolveEndpoint(String endpoint) { + if ( !endpoint.startsWith("/") ) { + endpoint = "/" + endpoint; + } + + String server = Hyperlink.preferences.getString(Hyperlink.SERVER_ADDR, ""); + if ( server.endsWith("/") ) { + server = server.substring(0, server.length() - 1); + } + + return server + "/api/v1" + endpoint; + } +} diff --git a/app/src/main/java/dev/garrettmills/starship/hyperlink/util/GsonRequest.java b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/GsonRequest.java new file mode 100644 index 0000000..a384c12 --- /dev/null +++ b/app/src/main/java/dev/garrettmills/starship/hyperlink/util/GsonRequest.java @@ -0,0 +1,61 @@ +package dev.garrettmills.starship.hyperlink.util; + +import com.android.volley.AuthFailureError; +import com.android.volley.NetworkResponse; +import com.android.volley.ParseError; +import com.android.volley.Request; +import com.android.volley.Response; +import com.android.volley.toolbox.HttpHeaderParser; +import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; + +import java.io.UnsupportedEncodingException; +import java.util.Map; + +public class GsonRequest extends Request { + private final Gson gson = new Gson(); + private final Class clazz; + private final Map headers; + private final Response.Listener listener; + + /** + * Make a GET request and return a parsed object from JSON. + * + * @param url URL of the request to make + * @param clazz Relevant class object, for Gson's reflection + * @param headers Map of request headers + */ + public GsonRequest(String url, Class clazz, Map headers, + Response.Listener listener, Response.ErrorListener errorListener) { + super(Method.GET, url, errorListener); + this.clazz = clazz; + this.headers = headers; + this.listener = listener; + } + + @Override + public Map getHeaders() throws AuthFailureError { + return headers != null ? headers : super.getHeaders(); + } + + @Override + protected void deliverResponse(T response) { + listener.onResponse(response); + } + + @Override + protected Response parseNetworkResponse(NetworkResponse response) { + try { + String json = new String( + response.data, + HttpHeaderParser.parseCharset(response.headers)); + return Response.success( + gson.fromJson(json, clazz), + HttpHeaderParser.parseCacheHeaders(response)); + } catch (UnsupportedEncodingException e) { + return Response.error(new ParseError(e)); + } catch (JsonSyntaxException e) { + return Response.error(new ParseError(e)); + } + } +}