Differential D133 Diff 422 app/src/main/java/it/reyboz/bustorino/viewmodels/LivePositionsViewModel.kt
Changeset View
Changeset View
Standalone View
Standalone View
app/src/main/java/it/reyboz/bustorino/viewmodels/LivePositionsViewModel.kt
- This file was moved from app/src/main/java/it/reyboz/bustorino/viewmodels/MQTTPositionsViewModel.kt.
| Show All 14 Lines | BusTO - ViewModel components | ||||
| You should have received a copy of the GNU General Public License | You should have received a copy of the GNU General Public License | ||||
| along with this program. If not, see <http://www.gnu.org/licenses/>. | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
| */ | */ | ||||
| package it.reyboz.bustorino.viewmodels | package it.reyboz.bustorino.viewmodels | ||||
| import android.app.Application | import android.app.Application | ||||
| import android.util.Log | import android.util.Log | ||||
| import androidx.lifecycle.* | import androidx.lifecycle.* | ||||
| import com.android.volley.Response | |||||
| import it.reyboz.bustorino.backend.NetworkVolleyManager | |||||
| import it.reyboz.bustorino.backend.gtfs.GtfsRtPositionsRequest | |||||
| import it.reyboz.bustorino.backend.gtfs.LivePositionUpdate | import it.reyboz.bustorino.backend.gtfs.LivePositionUpdate | ||||
| import it.reyboz.bustorino.backend.mato.MQTTMatoClient | import it.reyboz.bustorino.backend.mato.MQTTMatoClient | ||||
| import it.reyboz.bustorino.data.GtfsRepository | import it.reyboz.bustorino.data.GtfsRepository | ||||
| import it.reyboz.bustorino.data.MatoPatternsDownloadWorker | import it.reyboz.bustorino.data.MatoPatternsDownloadWorker | ||||
| import it.reyboz.bustorino.data.gtfs.TripAndPatternWithStops | import it.reyboz.bustorino.data.gtfs.TripAndPatternWithStops | ||||
| import kotlinx.coroutines.delay | |||||
| import kotlinx.coroutines.launch | import kotlinx.coroutines.launch | ||||
| typealias UpdatesMap = HashMap<String, LivePositionUpdate> | class LivePositionsViewModel(application: Application): AndroidViewModel(application) { | ||||
| class MQTTPositionsViewModel(application: Application): AndroidViewModel(application) { | |||||
| private val gtfsRepo = GtfsRepository(application) | private val gtfsRepo = GtfsRepository(application) | ||||
| //private val updates = UpdatesMap() | //private val updates = UpdatesMap() | ||||
| private val updatesLiveData = MutableLiveData<ArrayList<LivePositionUpdate>>() | private val updatesLiveData = MutableLiveData<ArrayList<LivePositionUpdate>>() | ||||
| private val netVolleyManager = NetworkVolleyManager.getInstance(application) | |||||
| private var mqttClient = MQTTMatoClient.getInstance() | private var mqttClient = MQTTMatoClient.getInstance() | ||||
| private var lineListening = "" | private var lineListening = "" | ||||
| private var lastTimeReceived: Long = 0 | private var lastTimeReceived: Long = 0 | ||||
| private val positionListener = MQTTMatoClient.Companion.MQTTMatoListener{ | private val gtfsRtRequestRunning = MutableLiveData<Boolean>(false) | ||||
| /** | |||||
| * Responder to the MQTT Client | |||||
| */ | |||||
| private val matoPositionListener = MQTTMatoClient.Companion.MQTTMatoListener{ | |||||
| val mupds = ArrayList<LivePositionUpdate>() | val mupds = ArrayList<LivePositionUpdate>() | ||||
| if(lineListening==MQTTMatoClient.LINES_ALL){ | if(lineListening==MQTTMatoClient.LINES_ALL){ | ||||
| for(sdic in it.values){ | for(sdic in it.values){ | ||||
| for(update in sdic.values){ | for(update in sdic.values){ | ||||
| mupds.add(update) | mupds.add(update) | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | val updatesWithTripAndPatterns = gtfsTripsPatternsInDB.map { tripPatterns-> | ||||
| //downloadMissingPatterns (ArrayList(routesToDownload)) | //downloadMissingPatterns (ArrayList(routesToDownload)) | ||||
| MatoPatternsDownloadWorker.downloadPatternsForRoutes(routesToDownload.toList(), getApplication()) | MatoPatternsDownloadWorker.downloadPatternsForRoutes(routesToDownload.toList(), getApplication()) | ||||
| } | } | ||||
| return@map mdict | return@map mdict | ||||
| } | } | ||||
| fun requestPosUpdates(line: String){ | fun requestMatoPosUpdates(line: String){ | ||||
| lineListening = line | lineListening = line | ||||
| viewModelScope.launch { | viewModelScope.launch { | ||||
| mqttClient.startAndSubscribe(line,positionListener, getApplication()) | mqttClient.startAndSubscribe(line,matoPositionListener, getApplication()) | ||||
| } | } | ||||
| //updatePositions(1000) | //updatePositions(1000) | ||||
| } | } | ||||
| fun stopPositionsListening(){ | fun stopMatoUpdates(){ | ||||
| viewModelScope.launch { | viewModelScope.launch { | ||||
| val tt = System.currentTimeMillis() | val tt = System.currentTimeMillis() | ||||
| mqttClient.desubscribe(positionListener) | mqttClient.desubscribe(matoPositionListener) | ||||
| val time = System.currentTimeMillis() -tt | val time = System.currentTimeMillis() -tt | ||||
| Log.d(DEBUG_TI, "Took $time ms to unsubscribe") | Log.d(DEBUG_TI, "Took $time ms to unsubscribe") | ||||
| } | } | ||||
| } | } | ||||
| fun retriggerPositionUpdate(){ | fun retriggerPositionUpdate(){ | ||||
| if(updatesLiveData.value!=null){ | if(updatesLiveData.value!=null){ | ||||
| updatesLiveData.postValue(updatesLiveData.value) | updatesLiveData.postValue(updatesLiveData.value) | ||||
| } | } | ||||
| } | } | ||||
| //Gtfs Real time | |||||
| private val gtfsPositionsReqListener = object: GtfsRtPositionsRequest.Companion.RequestListener{ | |||||
| override fun onResponse(response: ArrayList<LivePositionUpdate>?) { | |||||
| Log.i(DEBUG_TI,"Got response from the GTFS RT server") | |||||
| response?.let {it:ArrayList<LivePositionUpdate> -> | |||||
| if (it.size == 0) { | |||||
| Log.w(DEBUG_TI,"No position updates from the GTFS RT server") | |||||
| return | |||||
| } | |||||
| else { | |||||
| //Log.i(DEBUG_TI, "Posting value to positionsLiveData") | |||||
| viewModelScope.launch { updatesLiveData.postValue(it) } | |||||
| } | |||||
| } | |||||
| gtfsRtRequestRunning.postValue(false) | |||||
| } | |||||
| } | |||||
| private val positionRequestErrorListener = Response.ErrorListener { | |||||
| Log.e(DEBUG_TI, "Could not download the update, error:\n"+it.stackTrace) | |||||
| gtfsRtRequestRunning.postValue(false) | |||||
| } | |||||
| fun requestGTFSUpdates(){ | |||||
| if(gtfsRtRequestRunning.value == null || !gtfsRtRequestRunning.value!!) { | |||||
| val request = GtfsRtPositionsRequest(positionRequestErrorListener, gtfsPositionsReqListener) | |||||
| netVolleyManager.requestQueue.add(request) | |||||
| Log.i(DEBUG_TI, "Requested GTFS realtime position updates") | |||||
| gtfsRtRequestRunning.value = true | |||||
| } | |||||
| } | |||||
| fun requestDelayedGTFSUpdates(timems: Long){ | |||||
| viewModelScope.launch { | |||||
| delay(timems) | |||||
| requestGTFSUpdates() | |||||
| } | |||||
| } | |||||
| companion object{ | companion object{ | ||||
| private const val DEBUG_TI = "BusTO-MQTTLiveData" | private const val DEBUG_TI = "BusTO-MQTTLiveData" | ||||
| } | } | ||||
| } | } | ||||
| No newline at end of file | No newline at end of file | ||||
Public contents are in Creative Commons Attribution-ShareAlike 4.0 (CC-BY-SA) or GNU Free Documentation License (at your option) unless otherwise noted. · Contact / Register