diff options
Diffstat (limited to 'androidApp/src/main/java/mx/trackermap')
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( |