aboutsummaryrefslogtreecommitdiff
path: root/androidApp/src/main/java/mx/trackermap/TrackerMap/android
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2022-01-11 20:05:03 -0600
committerIván Ávalos <avalos@disroot.org>2022-01-11 20:05:03 -0600
commitee9e673695e221e115758b1ac32a6b63683ae7c9 (patch)
treeea175b800416bf82662538b9df0426bf5f8e4d8b /androidApp/src/main/java/mx/trackermap/TrackerMap/android
parent7baad408f97d7d4ab512b822bdc0799469e2d496 (diff)
downloadetbsa-trackermap-mobile-ee9e673695e221e115758b1ac32a6b63683ae7c9.tar.gz
etbsa-trackermap-mobile-ee9e673695e221e115758b1ac32a6b63683ae7c9.tar.bz2
etbsa-trackermap-mobile-ee9e673695e221e115758b1ac32a6b63683ae7c9.zip
unit_item.xml data fields are generated programmatically, and DevicesAdapter code was refactored into UnitRenderData to be shared with UnitMapFragment.
Diffstat (limited to 'androidApp/src/main/java/mx/trackermap/TrackerMap/android')
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt83
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/UnitRenderData.kt193
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/MapFragment.kt2
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt61
4 files changed, 228 insertions, 111 deletions
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
index 56b114d..e1ccd0a 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
@@ -1,10 +1,19 @@
package mx.trackermap.TrackerMap.android.devices
import android.graphics.Color
+import android.util.Size
+import android.util.TypedValue
+import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.GridLayout
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
+import com.mousebird.maply.ImageLoaderInterpreter
import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.databinding.UnitItemBinding
import mx.trackermap.TrackerMap.utils.Formatter
@@ -15,8 +24,6 @@ enum class Action {
CLICK, DETAILS, REPORTS, COMMANDS
}
-typealias ActionCallback = (unit: UnitInformation, action: Action) -> Unit
-
class DevicesAdapter(
private val units: List<UnitInformation>,
private val actionCallback: ActionCallback?
@@ -32,65 +39,19 @@ class DevicesAdapter(
val unit = units[position]
val context = holder.itemView.context
holder.binding.apply {
-
- unit.position?.let { position ->
- /* Status icon */
- position.speed?.let { speed ->
- if (speed >= 2) {
- statusIcon.setColorFilter(Color.GREEN)
- } else {
- statusIcon.setColorFilter(Color.RED)
- }
- } ?: run {
- statusIcon.setColorFilter(Color.GRAY)
- }
-
- /* Engine stop */
- val attributes = position.attributes
- if (attributes["out1"].toString() == "null") {
- engineStopIcon.visibility = View.GONE
- } else {
- 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)
- }
- }
- }
-
- unitName.text = unit.device.name
- driverName.text = unit.device.contact
- unitSpeed.text = Formatter.formatSpeed(unit.position?.speed ?: 0.0, SpeedUnit.KMH)
- lastAddress.text = unit.position?.address
- unit.position?.fixTime?.let {
- lastDate.text = Formatter.formatDate(it)
- }
- 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)
- }
- }
+ UnitRenderData.render(
+ UnitRenderData.UnitRenderViewHolder(
+ unitName = unitName,
+ statusIcon = statusIcon,
+ engineStopIcon = engineStopIcon,
+ gridLayout = gridLayout,
+ detailsButton = detailsButton,
+ reportsButton = reportsButton,
+ commandsButton = commandsButton,
+ unitCard = unitCard,
+ swipeLayout = swipeLayout
+ ), context, unit, actionCallback
+ )
}
}
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/UnitRenderData.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/UnitRenderData.kt
new file mode 100644
index 0000000..1b23ba0
--- /dev/null
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/UnitRenderData.kt
@@ -0,0 +1,193 @@
+package mx.trackermap.TrackerMap.android.devices
+
+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 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: Action) -> Unit
+
+class UnitRenderData {
+ data class UnitRenderViewHolder(
+ val unitName: TextView,
+ val statusIcon: ImageView,
+ val engineStopIcon: ImageView,
+ val gridLayout: GridLayout,
+ val detailsButton: Button,
+ val reportsButton: Button,
+ val commandsButton: Button,
+ val unitCard: CardView? = null,
+ val swipeLayout: SwipeLayout? = null
+ )
+
+ 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
+
+ /* 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)
+ )
+ )
+ }
+
+ /* 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.setGravity(Gravity.CENTER_VERTICAL)
+ 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 ext */
+ 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)
+ }
+
+ 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
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 39312a8..9bda9d4 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
@@ -260,7 +260,7 @@ class MapFragment : GlobeMapFragment() {
val lat = latitude * Math.PI / 180
val lon = longitude * Math.PI / 180
if (animated) {
- mapControl.animatePositionGeo(lon, lat, zoom, 0.5)
+ mapControl.animatePositionGeo(lon, lat, zoom, 0.2)
} else {
mapControl.setPositionGeo(lon, lat, zoom)
}
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
index 4f98a96..fc417a0 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
@@ -13,6 +13,7 @@ import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.databinding.UnitMapFragmentBinding
import mx.trackermap.TrackerMap.android.details.DetailsActivity
import mx.trackermap.TrackerMap.android.devices.Action
+import mx.trackermap.TrackerMap.android.devices.UnitRenderData
import mx.trackermap.TrackerMap.android.units.UnitsViewModel
import mx.trackermap.TrackerMap.client.models.UnitInformation
import mx.trackermap.TrackerMap.utils.Formatter
@@ -71,55 +72,17 @@ class UnitMapFragment : Fragment() {
return@let
}
- binding.apply {
- context?.let { context ->
- unit.position?.let { position ->
- /* Status icon */
- position.speed?.let { speed ->
- if (speed >= 2) {
- statusIcon.setColorFilter(Color.GREEN)
- } else {
- statusIcon.setColorFilter(Color.RED)
- }
- } ?: run {
- statusIcon.setColorFilter(Color.GRAY)
- }
-
- /* Engine stop */
- val attributes = position.attributes
- if (attributes["out1"].toString() == "null") {
- engineStopIcon.visibility = View.GONE
- } else {
- 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)
- }
- }
- }
-
- unitName.text = unit.device.name
- driverName.text = unit.device.contact
- unitSpeed.text =
- Formatter.formatSpeed(unit.position?.speed ?: 0.0, SpeedUnit.KMH)
- lastAddress.text = unit.position?.address
- unit.position?.fixTime?.let {
- lastDate.text = Formatter.formatDate(it)
- }
- detailsButton.setOnClickListener { itemAction(unit, Action.DETAILS) }
- reportsButton.setOnClickListener { itemAction(unit, Action.REPORTS) }
- commandsButton.setOnClickListener { itemAction(unit, Action.COMMANDS) }
- }
- }
+ UnitRenderData.render(
+ UnitRenderData.UnitRenderViewHolder(
+ unitName = binding.unitName,
+ statusIcon = binding.statusIcon,
+ engineStopIcon = binding.engineStopIcon,
+ gridLayout = binding.gridLayout,
+ detailsButton = binding.detailsButton,
+ reportsButton = binding.reportsButton,
+ commandsButton = binding.commandsButton
+ ), binding.mapUnitCard.context, unit, this::itemAction
+ )
unitsMapFragment.focusOn(unit.position!!.latitude!!, unit.position!!.longitude!!)
}