185 lines
5.4 KiB
Kotlin
Executable File
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)
|
|
}
|
|
|
|
}
|
|
|
|
|
|
} |