aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx
diff options
context:
space:
mode:
Diffstat (limited to 'androidApp/src/main/java/mx')
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/TrackerApp.kt12
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/commands/UnitCommandsViewModel.kt25
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt8
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt34
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt6
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt125
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt64
7 files changed, 99 insertions, 175 deletions
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/TrackerApp.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/TrackerApp.kt
index 1d181dd..aa92c91 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/TrackerApp.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/TrackerApp.kt
@@ -26,10 +26,8 @@ import mx.trackermap.TrackerMap.android.session.LoginViewModel
import mx.trackermap.TrackerMap.android.session.UserInformationViewModel
import mx.trackermap.TrackerMap.android.units.UnitsViewModel
import mx.trackermap.TrackerMap.client.apis.*
-import mx.trackermap.TrackerMap.controllers.GeofencesController
-import mx.trackermap.TrackerMap.controllers.ReportController
-import mx.trackermap.TrackerMap.controllers.SessionController
-import mx.trackermap.TrackerMap.controllers.UnitsController
+import mx.trackermap.TrackerMap.client.infrastructure.SessionManager
+import mx.trackermap.TrackerMap.controllers.*
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.androidx.viewmodel.dsl.viewModel
@@ -47,6 +45,9 @@ open class TrackerApp : Application() {
val appModule = module {
single { getString(R.string.default_server_url) }
+
+ factory { SessionManager(get()) }
+
factory { SessionApi(get()) }
factory { UsersApi(get()) }
factory { DevicesApi(get()) }
@@ -59,10 +60,11 @@ open class TrackerApp : Application() {
factory { UnitsController(get(), get()) }
factory { GeofencesController(get()) }
factory { ReportController(get(), get()) }
+ factory { CommandsController(get()) }
viewModel { LoginViewModel() }
viewModel { UnitInformationViewModel(get()) }
- viewModel { UnitCommandsViewModel(get()) }
+ viewModel { UnitCommandsViewModel() }
viewModel { UnitsViewModel(get()) }
viewModel { UnitReportsViewModel(get()) }
viewModel { UserInformationViewModel() }
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/commands/UnitCommandsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/commands/UnitCommandsViewModel.kt
index 3bb7f11..d1b1e69 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/commands/UnitCommandsViewModel.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/commands/UnitCommandsViewModel.kt
@@ -23,14 +23,15 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.launch
-import mx.trackermap.TrackerMap.client.apis.CommandsApi
import mx.trackermap.TrackerMap.client.models.Command
+import mx.trackermap.TrackerMap.controllers.CommandsController
import org.koin.core.component.KoinComponent
+import org.koin.core.component.inject
@DelicateCoroutinesApi
-class UnitCommandsViewModel(
- private val commandsApi: CommandsApi
-) : ViewModel(), KoinComponent {
+class UnitCommandsViewModel : ViewModel(), KoinComponent {
+
+ private val commandsController: CommandsController by inject()
var commands = MutableLiveData<List<Command>>()
private var selectedCommand: Command? = null
@@ -38,9 +39,11 @@ class UnitCommandsViewModel(
fun fetchCommands(deviceId: Int?) {
this.deviceId = deviceId
- viewModelScope.launch {
- val commands = commandsApi.commandsGet(deviceId = deviceId)
- this@UnitCommandsViewModel.commands.value = commands.toList()
+ deviceId?.let {
+ viewModelScope.launch {
+ val commands = commandsController.fetchCommands(it)
+ this@UnitCommandsViewModel.commands.value = commands.toList()
+ }
}
}
@@ -59,9 +62,11 @@ class UnitCommandsViewModel(
}
Log.d("UnitCommandsVM", "Sending command - $selectedCommand")
- viewModelScope.launch {
- val command = commandsApi.commandsSendPost(selectedCommand!!)
- Log.d("UnitCommandsVM", "Command sent - $command")
+ selectedCommand?.let {
+ viewModelScope.launch {
+ val command = commandsController.sendCommand(it)
+ Log.d("UnitCommandsVM", "Command sent - $command")
+ }
}
}
} \ No newline at end of file
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
index 22c75f4..60ad531 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/details/reports/UnitReportsFragment.kt
@@ -149,16 +149,16 @@ class UnitReportsFragment : Fragment() {
when (report) {
is ReportController.Report.PositionsReport -> {
mapFragment.display(unitReportsViewModel.geofences.value!!)
- mapFragment.display(report.positions, isReport = true, center = true)
+ mapFragment.display(report.positions.toTypedArray(), isReport = true, center = true)
showMap(true)
}
is ReportController.Report.EventsReport -> {
- display(report.events)
+ display(report.events.toTypedArray())
showMap(false)
}
is ReportController.Report.StopsReport -> {
mapFragment.display(unitReportsViewModel.geofences.value!!)
- mapFragment.display(report.stops)
+ mapFragment.display(report.stops.toTypedArray())
showMap(true)
}
is ReportController.Report.XlsxReport -> {
@@ -232,7 +232,7 @@ class UnitReportsFragment : Fragment() {
binding.reportsMapContainer.visibility = View.GONE
binding.eventsTable.removeViews(1, max(0, binding.eventsTable.childCount - 1))
- val context = context!!
+ val context = requireContext()
events.forEach { event ->
val layoutParams = TableRow.LayoutParams()
layoutParams.setMargins(
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt
index a76ebde..b04bfbc 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt
@@ -38,8 +38,8 @@ import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.shared.MarkerTransformations
import mx.trackermap.TrackerMap.client.models.Geofence
import mx.trackermap.TrackerMap.client.models.MapLayer
+import mx.trackermap.TrackerMap.client.models.Marker
import mx.trackermap.TrackerMap.utils.MapCalculus
-import mx.trackermap.TrackerMap.utils.MarkerType
typealias SetupCallback = () -> Unit
typealias MarkerCallback = (Int?) -> Unit
@@ -48,14 +48,6 @@ open class MapFragment : GlobeMapFragment() {
private var loader: QuadImageLoader? = null
- data class Marker(
- val id: Int,
- val name: String,
- val latitude: Double,
- val longitude: Double,
- val type: MarkerType = MarkerType.DEFAULT
- )
-
var hasStarted: Boolean = false
val setupCallbacks = mutableListOf<SetupCallback>()
var markerCallback: MarkerCallback? = null
@@ -185,9 +177,9 @@ open class MapFragment : GlobeMapFragment() {
}.toTypedArray()
val fontSize = context?.resources?.getDimensionPixelSize(R.dimen.marker_label_text_size)
- val colorReport = ContextCompat.getColor(context!!, R.color.colorReport)
- val colorLabel = ContextCompat.getColor(context!!, R.color.colorMarkerLabel)
- val colorLabelOutline = ContextCompat.getColor(context!!, R.color.colorMarkerLabelOutline)
+ val colorReport = ContextCompat.getColor(requireContext(), R.color.colorReport)
+ val colorLabel = ContextCompat.getColor(requireContext(), R.color.colorMarkerLabel)
+ val colorLabelOutline = ContextCompat.getColor(requireContext(), R.color.colorMarkerLabelOutline)
val vectorWidth = context?.resources?.getDimensionPixelSize(R.dimen.report_label_width)?.toFloat()
val vectorInfo = VectorInfo()
@@ -210,9 +202,9 @@ open class MapFragment : GlobeMapFragment() {
screenMarker.image = if (isReport) {
// For reports, position, start and end, icons must be different
when (i) {
- 0 -> getIcon(MarkerType.REPORT_START)
- markers.size - 1 -> getIcon(MarkerType.REPORT_END)
- else -> getIcon(MarkerType.REPORT_POSITION)
+ 0 -> getIcon(Marker.Type.REPORT_START)
+ markers.size - 1 -> getIcon(Marker.Type.REPORT_END)
+ else -> getIcon(Marker.Type.REPORT_POSITION)
}
} else getIcon(marker.type)
screenMarker.size = if (isReport) {
@@ -291,9 +283,9 @@ open class MapFragment : GlobeMapFragment() {
clear(true)
val fontSize = context?.resources?.getDimensionPixelSize(R.dimen.marker_label_text_size)
- val colorFill = ContextCompat.getColor(context!!, R.color.colorGeofence)
- val colorLabel = ContextCompat.getColor(context!!, R.color.colorGeofenceLabel)
- val colorLabelOutline = ContextCompat.getColor(context!!, R.color.colorMarkerLabelOutline)
+ val colorFill = ContextCompat.getColor(requireContext(), R.color.colorGeofence)
+ val colorLabel = ContextCompat.getColor(requireContext(), R.color.colorGeofenceLabel)
+ val colorLabelOutline = ContextCompat.getColor(requireContext(), R.color.colorMarkerLabelOutline)
val vectorWidth = context?.resources?.getDimensionPixelSize(R.dimen.geofence_label_width)?.toFloat()
val vectorInfo = VectorInfo()
@@ -428,10 +420,10 @@ open class MapFragment : GlobeMapFragment() {
}
}
- private fun getIcon(markerType: MarkerType): Bitmap {
+ private fun getIcon(markerType: Marker.Type): Bitmap {
return ResourcesCompat.getDrawable(
- activity!!.resources,
+ requireActivity().resources,
MarkerTransformations.markerTypeToResourceId(markerType),
- activity!!.theme)!!.toBitmap(144, 144)
+ requireActivity().theme)!!.toBitmap(144, 144)
}
} \ No newline at end of file
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt
index c9eab70..aa2faf9 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapWrapperFragment.kt
@@ -165,7 +165,7 @@ class MapWrapperFragment: Fragment() {
Log.d("MapWrapperFragment", "Displaying positions: $positions")
mapFragment.display(
- positions.mapNotNull(MarkerTransformations::positionToMarker).toTypedArray(),
+ positions.mapNotNull(Marker::fromPosition).toTypedArray(),
isReport = isReport,
center = center
)
@@ -181,7 +181,7 @@ class MapWrapperFragment: Fragment() {
Log.d("MapWrapperFragment", "Displaying units: $units")
mapFragment.display(
- units.mapNotNull(MarkerTransformations::unitToMarker).toTypedArray(),
+ units.mapNotNull(Marker::fromUnit).toTypedArray(),
isReport = isReport,
center = center
)
@@ -197,7 +197,7 @@ class MapWrapperFragment: Fragment() {
Log.d("MapWrapperFragment", "Displaying stops: $stops")
mapFragment.display(
- stops.mapNotNull(MarkerTransformations::stopToMarker).toTypedArray(),
+ stops.mapNotNull(Marker::fromStop).toTypedArray(),
isReport = true
)
} else {
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt
index 242cccf..1c4ad3b 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt
@@ -17,107 +17,34 @@
*/
package mx.trackermap.TrackerMap.android.shared
-import android.util.Log
import mx.trackermap.TrackerMap.android.R
-import mx.trackermap.TrackerMap.android.map.MapFragment
-import mx.trackermap.TrackerMap.client.models.Position
-import mx.trackermap.TrackerMap.client.models.Stop
-import mx.trackermap.TrackerMap.client.models.UnitInformation
-import mx.trackermap.TrackerMap.utils.MarkerType
+import mx.trackermap.TrackerMap.client.models.Marker
object MarkerTransformations {
- fun unitToMarker(unit: UnitInformation): MapFragment.Marker? {
- if (unit.position == null || unit.position!!.latitude == null || unit.position!!.longitude == null) {
- return null
- }
-
- return MapFragment.Marker(
- unit.position!!.id!!,
- unit.device.name,
- unit.position!!.latitude!!,
- unit.position!!.longitude!!,
- categoryToMarkerType(unit.device.category ?: "")
- )
- }
-
- fun positionToMarker(position: Position): MapFragment.Marker? {
- if (position.latitude == null || position.longitude == null) {
- return null
- }
-
- return MapFragment.Marker(
- position.id!!,
- "",
- position.latitude!!,
- position.longitude!!
- )
- }
-
- fun stopToMarker(stop: Stop): MapFragment.Marker? {
- Log.d("MarkerTransformations", "stopToMarker($stop)")
- if (stop.latitude == null || stop.longitude == null) {
- return null
- }
-
- return MapFragment.Marker(
- stop.deviceId!!,
- stop.deviceName!!,
- stop.latitude!!,
- stop.longitude!!
- )
- }
-
- private fun categoryToMarkerType(category: String?): MarkerType {
- return when (category?.lowercase()) {
- "animal" -> MarkerType.ANIMAL
- "backhoe" -> MarkerType.BACKHOE
- "bicycle" -> MarkerType.BICYCLE
- "boat" -> MarkerType.BOAT
- "bus" -> MarkerType.BUS
- "car" -> MarkerType.CAR
- "crane" -> MarkerType.CRANE
- "helicopter" -> MarkerType.HELICOPTER
- "motorcycle" -> MarkerType.MOTORCYCLE
- "offroad" -> MarkerType.OFFROAD
- "person" -> MarkerType.PERSON
- "pickup" -> MarkerType.PICKUP
- "plane" -> MarkerType.PLANE
- "scooter" -> MarkerType.SCOOTER
- "ship" -> MarkerType.SHIP
- "tractor" -> MarkerType.TRACTOR
- "train" -> MarkerType.TRAIN
- "tram" -> MarkerType.TRAM
- "trolleybus" -> MarkerType.TROLLEYBUS
- "truck" -> MarkerType.TRUCK
- "van" -> MarkerType.VAN
- else -> MarkerType.DEFAULT
- }
- }
-
- fun markerTypeToResourceId(markerType: MarkerType): Int {
+ fun markerTypeToResourceId(markerType: Marker.Type): Int {
return when (markerType) {
- MarkerType.ANIMAL -> R.drawable.map_animal
- MarkerType.BACKHOE -> R.drawable.map_backhoe
- MarkerType.BICYCLE -> R.drawable.map_bicycle
- MarkerType.BOAT -> R.drawable.map_boat
- MarkerType.BUS -> R.drawable.map_bus
- MarkerType.CAR -> R.drawable.map_car
- MarkerType.CRANE -> R.drawable.map_crane
- MarkerType.DEFAULT -> R.drawable.map_default
- MarkerType.HELICOPTER -> R.drawable.map_helicopter
- MarkerType.MOTORCYCLE -> R.drawable.map_motorcycle
- MarkerType.OFFROAD -> R.drawable.map_offroad
- MarkerType.PERSON -> R.drawable.map_person
- MarkerType.PICKUP -> R.drawable.map_pickup
- MarkerType.PLANE -> R.drawable.map_plane
- MarkerType.SCOOTER -> R.drawable.map_scooter
- MarkerType.SHIP -> R.drawable.map_ship
- MarkerType.TRACTOR -> R.drawable.map_tractor
- MarkerType.TRAIN -> R.drawable.map_train
- MarkerType.TRAM -> R.drawable.map_tram
- MarkerType.TROLLEYBUS -> R.drawable.map_trolleybus
- MarkerType.TRUCK -> R.drawable.map_truck
- MarkerType.VAN -> R.drawable.map_van
+ Marker.Type.ANIMAL -> R.drawable.map_animal
+ Marker.Type.BACKHOE -> R.drawable.map_backhoe
+ Marker.Type.BICYCLE -> R.drawable.map_bicycle
+ Marker.Type.BOAT -> R.drawable.map_boat
+ Marker.Type.BUS -> R.drawable.map_bus
+ Marker.Type.CAR -> R.drawable.map_car
+ Marker.Type.CRANE -> R.drawable.map_crane
+ Marker.Type.DEFAULT -> R.drawable.map_default
+ Marker.Type.HELICOPTER -> R.drawable.map_helicopter
+ Marker.Type.MOTORCYCLE -> R.drawable.map_motorcycle
+ Marker.Type.OFFROAD -> R.drawable.map_offroad
+ Marker.Type.PERSON -> R.drawable.map_person
+ Marker.Type.PICKUP -> R.drawable.map_pickup
+ Marker.Type.PLANE -> R.drawable.map_plane
+ Marker.Type.SCOOTER -> R.drawable.map_scooter
+ Marker.Type.SHIP -> R.drawable.map_ship
+ Marker.Type.TRACTOR -> R.drawable.map_tractor
+ Marker.Type.TRAIN -> R.drawable.map_train
+ Marker.Type.TRAM -> R.drawable.map_tram
+ Marker.Type.TROLLEYBUS -> R.drawable.map_trolleybus
+ Marker.Type.TRUCK -> R.drawable.map_truck
+ Marker.Type.VAN -> R.drawable.map_van
MarkerType.REPORT_POSITION -> R.drawable.map_report_position
MarkerType.REPORT_START -> R.drawable.map_report_start
@@ -154,10 +81,10 @@ object MarkerTransformations {
}
fun categoryToResourceId(category: String?): Int {
- return markerTypeToResourceId(categoryToMarkerType(category))
+ return markerTypeToResourceId(Marker.categoryToMarkerType(category))
}
fun categoryToStringId(category: String?): Int {
- return markerTypeToResourceId(categoryToMarkerType(category))
+ return markerTypeToStringId(Marker.categoryToMarkerType(category))
}
} \ No newline at end of file
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt
index 123e1ab..9a9f85c 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt
@@ -89,43 +89,41 @@ class UnitRenderData {
}
}
- statusIcon.visibility = View.GONE
- engineStopIcon.visibility = View.GONE
-
- unit.position?.let { position ->
- /* Status icon */
- statusIcon.visibility = View.VISIBLE
- position.speed?.let { speed ->
- if (speed >= 2) {
- statusIcon.setColorFilter(
- ContextCompat.getColor(context, R.color.colorOnline)
- )
- } else {
- statusIcon.setColorFilter(
- ContextCompat.getColor(context, R.color.colorOffline)
- )
- }
- } ?: run {
+ /* Status icon */
+ when (unit.getStatus()) {
+ UnitInformation.Status.ONLINE -> {
+ statusIcon.setColorFilter(
+ ContextCompat.getColor(context, R.color.colorOnline)
+ )
+ }
+ UnitInformation.Status.OFFLINE -> {
+ statusIcon.setColorFilter(
+ ContextCompat.getColor(context, R.color.colorOffline)
+ )
+ }
+ else -> {
statusIcon.setColorFilter(Color.GRAY)
}
+ }
- /* Engine stop */
- val attributes = position.attributes
- if (attributes["out1"].toString() != "null") {
+ /* Engine stop */
+ when(unit.getEngineStop()) {
+ UnitInformation.EngineStop.ON -> {
engineStopIcon.visibility = View.VISIBLE
- engineStopIcon.setImageResource(
- when (attributes["out1"].toString()) {
- "true" -> R.drawable.device_unlocked
- "false" -> R.drawable.device_locked
- else -> R.drawable.device_locked
- }
- )
- engineStopIcon.contentDescription = when (attributes["out1"].toString()) {
- "true" -> context.getString(R.string.unit_lock_on)
- "false" -> context.getString(R.string.unit_lock_off)
- else -> context.getString(R.string.unit_lock_on)
- }
+ engineStopIcon.setImageResource(R.drawable.device_unlocked)
+ engineStopIcon.contentDescription = context.getString(R.string.unit_lock_on)
+ }
+ UnitInformation.EngineStop.OFF -> {
+ engineStopIcon.visibility = View.VISIBLE
+ engineStopIcon.setImageResource(R.drawable.device_locked)
+ engineStopIcon.contentDescription = context.getString(R.string.unit_lock_off)
}
+ UnitInformation.EngineStop.UNKNOWN -> {
+ engineStopIcon.visibility = View.GONE
+ }
+ }
+
+ unit.position?.let { position ->
/* Speed */
position.speed?.let { speed ->
@@ -150,7 +148,7 @@ class UnitRenderData {
}
/* Hourmeter */
- position.attributes["hours"]?.longOrNull?.let {
+ unit.getHourmeter()?.let {
if (it > 0) {
details.add(
Triple(