yelpmapapp/app/src/main/java/fishrungames/yelpmapapp/DataProvider.kt

185 lines
5.4 KiB
Kotlin
Executable File

package fishrungames.yelpmapapp
import android.content.Context
import android.os.Handler
import com.koushikdutta.ion.Ion
import fishrungames.yelpmapapp.asyncTasks.HandleBusinessDetailResponseAsyncTask
import fishrungames.yelpmapapp.asyncTasks.HandleMapMarkersResponseAsyncTask
import fishrungames.yelpmapapp.asyncTasks.HandleReviewListResponseAsyncTask
import fishrungames.yelpmapapp.records.BusinessDetailRecord
import fishrungames.yelpmapapp.records.MapMarkerRecord
import fishrungames.yelpmapapp.records.ReviewListRecord
import java.util.*
/**
* Created by mephi on 09.06.2017.
*/
class DataProvider(
val context: Context,
val onUpdateMapMarkers : ((Map<String, MapMarkerRecord>) -> Unit),
val onUpdateBusinessDetail : ((BusinessDetailRecord) -> Unit),
val onUpdateReviewList : ((Pair<String, ReviewListRecord>) -> Unit)
) {
val yelpApiKey = "TFhv6H25FV25ETpIC64TmN1sZ98yLIK3-4IZ7-CFSaRIyO6Xo97n1uI5207vo3JA-gLgu1f_7dw4LLWrpAcVAELSVFwHxYDL2FEfwaheJ9WvjbgEbjd3ADWAkt46WXYx"
val businessDetailCache = mutableMapOf<String, BusinessDetailRecord>()
val reviewListCache = mutableMapOf<String, Pair<String, ReviewListRecord>>()
val handler = Handler()
var latestRequestDate : Date? = null
var requestScheduled : Boolean = false
var nextLocationToRequest : Pair<Double, Double>? = null
fun requestMapMarkerData(lat : Double, lon : Double)
{
nextLocationToRequest = Pair<Double, Double>(lat, lon)
val requestLimitInMs = 2000L
val newDate = Date()
if (latestRequestDate == null)
{
innerRequestMapMarkerData()
}
else {
if (!requestScheduled) {
requestScheduled = true
val timeDiffMs = newDate.time - latestRequestDate!!.time
if (timeDiffMs >= requestLimitInMs) {
innerRequestMapMarkerData()
} else {
handler.postDelayed({ innerRequestMapMarkerData() }, requestLimitInMs - timeDiffMs)
}
}
}
}
fun innerRequestMapMarkerData()
{
if (nextLocationToRequest == null)
{
return
}
val lat = nextLocationToRequest!!.first
val lon = nextLocationToRequest!!.second
val radius = 2000
latestRequestDate = Date()
requestScheduled = false
Ion.with(context)
.load("https://api.yelp.com/v3/businesses/search?latitude=${lat}&longitude=${lon}&radius=${radius}")
.addHeader("Authorization", "Bearer " + yelpApiKey)
.asJsonObject()
.setCallback { e, result ->
if (e != null)
{
return@setCallback
}
if (result == null)
{
return@setCallback
}
HandleMapMarkersResponseAsyncTask(onUpdateMapMarkers).execute(result)
}
}
fun requestBusinessDetail(id: String)
{
if (reviewListCache.containsKey(id) && reviewListCache[id] != null)
{
onUpdateReviewList(reviewListCache[id]!!)
}
Ion.with(context)
.load("https://api.yelp.com/v3/businesses/${id}")
.addHeader("Authorization", "Bearer " + yelpApiKey)
.asJsonObject()
.setCallback { e, result ->
if (e != null)
{
return@setCallback
}
if (result == null)
{
return@setCallback
}
HandleBusinessDetailResponseAsyncTask(this::handleUpdateBusinessDetail).execute(result)
}
}
fun requestReviewList(id: String)
{
if (businessDetailCache.containsKey(id) && businessDetailCache[id] != null)
{
onUpdateBusinessDetail(businessDetailCache[id]!!)
}
Ion.with(context)
.load("https://api.yelp.com/v3/businesses/${id}/reviews")
.addHeader("Authorization", "Bearer " + yelpApiKey)
.asJsonObject()
.setCallback { e, result ->
if (e != null)
{
return@setCallback
}
if (result == null)
{
return@setCallback
}
HandleReviewListResponseAsyncTask(id, this::handleUpdateReviewList).execute(result)
}
}
fun handleUpdateBusinessDetail(businessDetailRecord : BusinessDetailRecord?)
{
if (businessDetailRecord != null && businessDetailRecord.id != null)
{
businessDetailCache[businessDetailRecord.id] = businessDetailRecord
onUpdateBusinessDetail(businessDetailRecord)
}
}
fun handleUpdateReviewList(reviewListRecordPair : Pair<String, ReviewListRecord>?)
{
if (reviewListRecordPair != null) {
reviewListCache[reviewListRecordPair.first] = reviewListRecordPair
onUpdateReviewList(reviewListRecordPair)
}
}
}