From 5d0ec6738d7964cfecdab1fe9fd9a15704052644 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Wed, 13 May 2020 15:04:48 -0700 Subject: [PATCH] Refactor request system to hide away some of the generics cruft. --- .../requests/AuthenticatedRequest.kt | 22 +++++++++++++++++++ .../requests/CollarDetailRequest.kt | 19 +++++----------- .../requests/CollarHistoryRequest.kt | 19 +++++----------- .../requests/CollarRequest.kt | 19 +++++----------- .../requests/DistanceTraveledRequest.kt | 19 +++++----------- .../fencelessgrazing/requests/GsonListener.kt | 16 ++++++++------ .../fencelessgrazing/requests/LoginRequest.kt | 2 +- 7 files changed, 52 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/com/danilafe/fencelessgrazing/requests/AuthenticatedRequest.kt diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/AuthenticatedRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/AuthenticatedRequest.kt new file mode 100644 index 0000000..902a8e9 --- /dev/null +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/AuthenticatedRequest.kt @@ -0,0 +1,22 @@ +package com.danilafe.fencelessgrazing.requests + +import com.android.volley.Response +import com.android.volley.toolbox.StringRequest + +open class AuthenticatedRequest( + baseUrl: String, + apiEndpoint: String, + private val token: String, + listener: Response.Listener, + error: Response.ErrorListener +) : StringRequest( + Method.GET, "${baseUrl}${apiEndpoint}", + listener, error +) { + + override fun getHeaders(): MutableMap { + val newMap = HashMap(super.getHeaders()) + newMap["Authorization"] = "Bearer $token" + return newMap + } +} \ No newline at end of file diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarDetailRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarDetailRequest.kt index 7e5b79f..d26a7e0 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarDetailRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarDetailRequest.kt @@ -10,19 +10,10 @@ import com.google.gson.reflect.TypeToken class CollarDetailRequest( baseUrl: String, collarId: Int, - private val token : String, + token : String, listener: Response.Listener, error: Response.ErrorListener -) : StringRequest( - Method.GET, "${baseUrl}/collars/$collarId/details", - GsonListener( - object : TypeToken() {}.type, - listener - ), error -) { - - override fun getHeaders(): MutableMap { - return mutableMapOf("Authorization" to "Bearer $token") - } - -} \ No newline at end of file +) : AuthenticatedRequest( + baseUrl, "/collars/$collarId/details", token, + listener.toGsonListener(), error +) \ No newline at end of file diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarHistoryRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarHistoryRequest.kt index 7dfb5fa..e414854 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarHistoryRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarHistoryRequest.kt @@ -9,19 +9,10 @@ import com.google.gson.reflect.TypeToken class CollarHistoryRequest( baseUrl: String, collarId: Int, - private val token : String, + token : String, listener: Response.Listener>, error: Response.ErrorListener -) : StringRequest( - Method.GET, "${baseUrl}/collars/$collarId/history", - GsonListener( - object : TypeToken>() {}.type, - listener - ), error -) { - - override fun getHeaders(): MutableMap { - return mutableMapOf("Authorization" to "Bearer $token") - } - -} \ No newline at end of file +) : AuthenticatedRequest( + baseUrl, "/collars/$collarId/history", token, + listener.toGsonListener(), error +) \ No newline at end of file diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarRequest.kt index 5145a71..83867ef 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/CollarRequest.kt @@ -7,19 +7,10 @@ import com.google.gson.reflect.TypeToken class CollarRequest( baseUrl: String, - private val token : String, + token : String, listener: Response.Listener>, error: Response.ErrorListener -) : StringRequest( - Method.GET, "${baseUrl}/collars", - GsonListener( - object : TypeToken>() {}.type, - listener - ), error -) { - - override fun getHeaders(): MutableMap { - return mutableMapOf("Authorization" to "Bearer $token") - } - -} \ No newline at end of file +) : AuthenticatedRequest( + baseUrl, "/collars", token, + listener.toGsonListener(), error +) \ No newline at end of file diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/DistanceTraveledRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/DistanceTraveledRequest.kt index 18905af..2901e61 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/DistanceTraveledRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/DistanceTraveledRequest.kt @@ -7,19 +7,10 @@ import com.google.gson.reflect.TypeToken class DistanceTraveledRequest( baseUrl: String, - private val token : String, + token : String, listener: Response.Listener>, error: Response.ErrorListener -) : StringRequest( - Method.GET, "${baseUrl}/collars/stats/distance", - GsonListener( - object : TypeToken>() {}.type, - listener - ), error -) { - - override fun getHeaders(): MutableMap { - return mutableMapOf("Authorization" to "Bearer $token") - } - -} \ No newline at end of file +) : AuthenticatedRequest( + baseUrl, "/collars/stats/distance", token, + listener.toGsonListener(), error +) \ No newline at end of file diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/GsonListener.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/GsonListener.kt index 4e5dc4b..729ad1f 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/GsonListener.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/GsonListener.kt @@ -3,15 +3,17 @@ package com.danilafe.fencelessgrazing.requests import android.util.Log import com.android.volley.Response import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import java.lang.reflect.Type -class GsonListener(private val targetType : Type, private val stringListener : Response.Listener) : Response.Listener { - - private val gson = Gson() - +class GsonListener(val listener: Response.Listener, private val type: Type) : Response.Listener { override fun onResponse(response: String?) { - if(response == null) { return stringListener.onResponse(null) } - stringListener.onResponse(gson.fromJson(response, targetType)) + val transformed = response?.let { Gson().fromJson(it, type) } + listener.onResponse(transformed) } +} + +inline fun Response.Listener.toGsonListener(): Response.Listener { + return GsonListener(this, object : TypeToken(){}.type) +} -} \ No newline at end of file diff --git a/app/src/main/java/com/danilafe/fencelessgrazing/requests/LoginRequest.kt b/app/src/main/java/com/danilafe/fencelessgrazing/requests/LoginRequest.kt index 0c9c53b..7d8ce92 100644 --- a/app/src/main/java/com/danilafe/fencelessgrazing/requests/LoginRequest.kt +++ b/app/src/main/java/com/danilafe/fencelessgrazing/requests/LoginRequest.kt @@ -12,7 +12,7 @@ class LoginRequest( error: Response.ErrorListener ) : StringRequest ( Method.POST, "${baseUrl}/login", - GsonListener(LoginResult::class.java, listener), error + listener.toGsonListener(), error ) { override fun getParams(): MutableMap {