aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared
diff options
context:
space:
mode:
Diffstat (limited to 'androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared')
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt146
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt221
2 files changed, 367 insertions, 0 deletions
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
new file mode 100644
index 0000000..f684a10
--- /dev/null
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/MarkerTransformations.kt
@@ -0,0 +1,146 @@
+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
+
+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 {
+ 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
+
+ MarkerType.REPORT_POSITION -> R.drawable.map_report_position
+ MarkerType.REPORT_START -> R.drawable.map_report_start
+ MarkerType.REPORT_END -> R.drawable.map_report_end
+ }
+ }
+
+ fun markerTypeToStringId(markerType: MarkerType): Int {
+ return when (markerType) {
+ MarkerType.ANIMAL -> R.string.unit_category_animal
+ MarkerType.BACKHOE -> R.string.unit_category_backhoe
+ MarkerType.BICYCLE -> R.string.unit_category_bicycle
+ MarkerType.BOAT -> R.string.unit_category_boat
+ MarkerType.BUS -> R.string.unit_category_bus
+ MarkerType.CAR -> R.string.unit_category_car
+ MarkerType.CRANE -> R.string.unit_category_crane
+ MarkerType.DEFAULT -> R.string.unit_category_default
+ MarkerType.HELICOPTER -> R.string.unit_category_helicopter
+ MarkerType.MOTORCYCLE -> R.string.unit_category_motorcycle
+ MarkerType.OFFROAD -> R.string.unit_category_offroad
+ MarkerType.PERSON -> R.string.unit_category_person
+ MarkerType.PICKUP -> R.string.unit_category_pickup
+ MarkerType.PLANE -> R.string.unit_category_plane
+ MarkerType.SCOOTER -> R.string.unit_category_scooter
+ MarkerType.SHIP -> R.string.unit_category_ship
+ MarkerType.TRACTOR -> R.string.unit_category_tractor
+ MarkerType.TRAIN -> R.string.unit_category_train
+ MarkerType.TRAM -> R.string.unit_category_tram
+ MarkerType.TROLLEYBUS -> R.string.unit_category_trolleybus
+ MarkerType.TRUCK -> R.string.unit_category_truck
+ MarkerType.VAN -> R.string.unit_category_van
+ else -> R.string.unit_category_default
+ }
+ }
+
+ fun categoryToResourceId(category: String?): Int {
+ return markerTypeToResourceId(categoryToMarkerType(category))
+ }
+
+ fun categoryToStringId(category: String?): Int {
+ return markerTypeToResourceId(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
new file mode 100644
index 0000000..e8a4bd6
--- /dev/null
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/shared/UnitRenderData.kt
@@ -0,0 +1,221 @@
+package mx.trackermap.TrackerMap.android.shared
+
+import android.content.Context
+import android.graphics.Color
+import android.util.TypedValue
+import android.view.Gravity
+import android.view.View
+import android.widget.Button
+import android.widget.GridLayout
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.cardview.widget.CardView
+import androidx.core.content.ContextCompat
+import com.zerobranch.layout.SwipeLayout
+import kotlinx.serialization.json.longOrNull
+import mx.trackermap.TrackerMap.android.R
+import mx.trackermap.TrackerMap.client.models.UnitInformation
+import mx.trackermap.TrackerMap.utils.Formatter
+import mx.trackermap.TrackerMap.utils.SpeedUnit
+
+typealias ActionCallback = (unit: UnitInformation, action: UnitRenderData.Action) -> Unit
+
+class UnitRenderData {
+ data class UnitRenderViewHolder(
+ val unitName: TextView,
+ val unitIcon: ImageView? = null,
+ val statusIcon: ImageView,
+ val engineStopIcon: ImageView,
+ val gridLayout: GridLayout,
+ val detailsButton: Button? = null,
+ val reportsButton: Button? = null,
+ val commandsButton: Button? = null,
+ val unitCard: CardView? = null,
+ val swipeLayout: SwipeLayout? = null
+ )
+
+ enum class Action {
+ CLICK, DETAILS, REPORTS, COMMANDS
+ }
+
+ companion object {
+ fun render(
+ viewHolder: UnitRenderViewHolder,
+ context: Context,
+ unit: UnitInformation,
+ actionCallback: ActionCallback?
+ ) {
+ viewHolder.apply {
+ val details: MutableList<Triple<Int, String, String>> = mutableListOf()
+
+ /* Device name */
+ unitName.text = unit.device.name
+
+ /* Device icon */
+ unitIcon?.setImageResource(
+ MarkerTransformations.categoryToResourceId(unit.device.category)
+ )
+ unitIcon?.contentDescription = context.getString(
+ MarkerTransformations.categoryToStringId(unit.device.category)
+ )
+
+ /* Contact */
+ unit.device.contact?.let { contact ->
+ if (contact.isNotEmpty()) {
+ details.add(
+ Triple(
+ R.drawable.device_contact,
+ contact,
+ context.getString(R.string.unit_driver_name)
+ )
+ )
+ }
+ }
+
+ 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 {
+ statusIcon.setColorFilter(Color.GRAY)
+ }
+
+ /* Engine stop */
+ val attributes = position.attributes
+ if (attributes["out1"].toString() != "null") {
+ 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)
+ }
+ }
+
+ /* Speed */
+ position.speed?.let { speed ->
+ details.add(
+ Triple(
+ R.drawable.position_speed,
+ Formatter.formatSpeed(speed, SpeedUnit.KMH),
+ context.getString(R.string.unit_speed)
+ )
+ )
+ }
+
+ /* Address */
+ position.address?.let { address ->
+ details.add(
+ Triple(
+ R.drawable.position_address,
+ address,
+ context.getString(R.string.unit_last_address)
+ )
+ )
+ }
+
+ /* Hourmeter */
+ position.attributes["hours"]?.longOrNull?.let {
+ if (it > 0) {
+ details.add(
+ Triple(
+ R.drawable.position_hourmeter,
+ Formatter.formatHours(it),
+ context.getString(R.string.unit_hourmeter)
+ )
+ )
+ }
+ }
+
+ /* Date time */
+ position.fixTime?.let { fixTime ->
+ details.add(
+ Triple(
+ R.drawable.position_datetime,
+ Formatter.formatDate(fixTime),
+ context.getString(R.string.unit_last_date)
+ )
+ )
+ }
+ }
+
+ gridLayout.removeAllViewsInLayout()
+ val metrics = context.resources.displayMetrics
+ details.forEachIndexed { i, detail ->
+ /* Property icon */
+ val imageView = ImageView(gridLayout.context)
+ imageView.setImageResource(detail.first)
+ imageView.contentDescription = detail.third
+ imageView.setColorFilter(
+ ContextCompat.getColor(
+ context,
+ androidx.appcompat.R.color.secondary_text_default_material_light
+ )
+ )
+
+ val imageLayout = GridLayout.LayoutParams()
+ imageLayout.width = GridLayout.LayoutParams.WRAP_CONTENT
+ imageLayout.height = GridLayout.LayoutParams.WRAP_CONTENT
+ imageLayout.marginEnd =
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 6f, metrics).toInt()
+ imageLayout.rowSpec = GridLayout.spec(i)
+ imageLayout.columnSpec = GridLayout.spec(0)
+ imageView.layoutParams = imageLayout
+
+ /* Property text */
+ val textView = TextView(gridLayout.context)
+ textView.text = detail.second
+
+ val textLayout = GridLayout.LayoutParams()
+ textLayout.width = 0
+ textLayout.height = GridLayout.LayoutParams.MATCH_PARENT
+ textLayout.rowSpec = GridLayout.spec(i)
+ textLayout.columnSpec = GridLayout.spec(1, 1, 5f)
+ textView.layoutParams = textLayout
+
+ gridLayout.addView(imageView)
+ gridLayout.addView(textView)
+
+ imageLayout.setGravity(Gravity.CENTER)
+ }
+
+ actionCallback?.let { callback ->
+ unitCard?.setOnClickListener {
+ swipeLayout?.close()
+ callback(unit, Action.CLICK)
+ }
+ detailsButton?.setOnClickListener {
+ swipeLayout?.close()
+ callback(unit, Action.DETAILS)
+ }
+ reportsButton?.setOnClickListener {
+ swipeLayout?.close()
+ callback(unit, Action.REPORTS)
+ }
+ commandsButton?.setOnClickListener {
+ swipeLayout?.close()
+ callback(unit, Action.COMMANDS)
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file