package website.christine.xesite 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.nio.charset.Charset /** * 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 * * From here: https://developer.android.com/training/volley/request-custom */ class GsonGetRequest( url: String, private val clazz: Class, private val headers: MutableMap?, private val listener: Response.Listener, errorListener: Response.ErrorListener ) : Request(Method.GET, url, errorListener) { private val gson = Gson() override fun getHeaders(): MutableMap = headers ?: super.getHeaders() override fun deliverResponse(response: T) = listener.onResponse(response) override fun parseNetworkResponse(response: NetworkResponse?): Response { return try { val json = String( response?.data ?: ByteArray(0), Charset.forName(HttpHeaderParser.parseCharset(response?.headers))) Response.success( gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response)) } catch (e: UnsupportedEncodingException) { Response.error(ParseError(e)) } catch (e: JsonSyntaxException) { Response.error(ParseError(e)) } } }