diff options
5 files changed, 263 insertions, 36 deletions
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 106a2d9..4298058 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 @@ -24,17 +24,13 @@ import com.mousebird.maply.SphericalMercatorCoordSystem import java.io.File import kotlinx.coroutines.DelicateCoroutinesApi import mx.trackermap.TrackerMap.android.R +import mx.trackermap.TrackerMap.utils.MarkerType typealias MarkerCallback = (Int?) -> Unit @DelicateCoroutinesApi class MapFragment : GlobeMapFragment() { - enum class MarkerType { - ANIMAL, BICYCLE, BOAT, BUS, CAR, CRANE, DEFAULT, HELICOPTER, MOTORCYCLE, OFFROAD, PERSON, - PICKUP, PLANE, SCOOTER, SHIP, TRACTOR, TRAIN, TRAM, TROLLEYBUS, TRUCK, VAN - } - data class Marker( val id: Int, val latitude: Double, 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 b8f79dd..0d046c4 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 @@ -1,5 +1,7 @@ package mx.trackermap.TrackerMap.android.map +import android.content.Intent +import android.graphics.Color import android.os.Bundle import android.util.Log import android.view.LayoutInflater @@ -9,8 +11,12 @@ import androidx.fragment.app.Fragment import kotlinx.coroutines.DelicateCoroutinesApi 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.units.UnitsViewModel import mx.trackermap.TrackerMap.client.models.UnitInformation +import mx.trackermap.TrackerMap.utils.Formatter +import mx.trackermap.TrackerMap.utils.MarkerType import org.koin.androidx.viewmodel.ext.android.viewModel @DelicateCoroutinesApi @@ -62,7 +68,58 @@ class UnitMapFragment : Fragment() { return@let } - binding.unitInfoTest.text = unit.device.contact + 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.ic_baseline_lock_24 + "false" -> R.drawable.ic_baseline_lock_open_24 + else -> R.drawable.ic_baseline_lock_open_24 + } + ) + 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 = context.getString( + R.string.unit_speed_format, + unit.position?.speed?.toInt() ?: 0 + ) + 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) } + } + } + unitsMapFragment.focusOn(unit.position!!.latitude!!, unit.position!!.longitude!!) } } @@ -78,29 +135,45 @@ class UnitMapFragment : Fragment() { unit.position!!.latitude!!, unit.position!!.longitude!!, when (unit.device.category?.lowercase()) { - "animal" -> MapFragment.MarkerType.ANIMAL - "bicycle" -> MapFragment.MarkerType.BICYCLE - "boat" -> MapFragment.MarkerType.BOAT - "bus" -> MapFragment.MarkerType.BUS - "car" -> MapFragment.MarkerType.CAR - "crane" -> MapFragment.MarkerType.CRANE - "helicopter" -> MapFragment.MarkerType.HELICOPTER - "motorcycle" -> MapFragment.MarkerType.MOTORCYCLE - "offroad" -> MapFragment.MarkerType.OFFROAD - "person" -> MapFragment.MarkerType.PERSON - "pickup" -> MapFragment.MarkerType.PICKUP - "plane" -> MapFragment.MarkerType.PLANE - "scooter" -> MapFragment.MarkerType.SCOOTER - "ship" -> MapFragment.MarkerType.SHIP - "tractor" -> MapFragment.MarkerType.TRACTOR - "train" -> MapFragment.MarkerType.TRAIN - "tram" -> MapFragment.MarkerType.TRAM - "trolleybus" -> MapFragment.MarkerType.TROLLEYBUS - "truck" -> MapFragment.MarkerType.TRUCK - "van" -> MapFragment.MarkerType.VAN - else -> MapFragment.MarkerType.DEFAULT + "animal" -> MarkerType.ANIMAL + "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 } ) } + private fun itemAction(unit: UnitInformation, action: Action) { + when (action) { + Action.DETAILS, Action.REPORTS, Action.COMMANDS -> { + Log.d("DevicesFragment", "Action: $action - Unit: $unit") + val activity = requireActivity() + val intent = Intent(activity.applicationContext, DetailsActivity::class.java) + intent.putExtra(DetailsActivity.DEVICE_ID_EXTRA, unit.device.id) + intent.putExtra(DetailsActivity.ACTION_EXTRA, action) + startActivity(intent) + } + Action.CLICK -> { + unitsViewModel.selectUnit(unit) + } + } + } + }
\ No newline at end of file diff --git a/androidApp/src/main/res/layout/unit_item.xml b/androidApp/src/main/res/layout/unit_item.xml index 9296534..96011b9 100644 --- a/androidApp/src/main/res/layout/unit_item.xml +++ b/androidApp/src/main/res/layout/unit_item.xml @@ -17,6 +17,7 @@ android:layout_gravity="end" android:paddingTop="@dimen/card_padding" android:paddingBottom="@dimen/card_padding" + android:paddingStart="@dimen/card_padding" android:paddingEnd="@dimen/card_padding" android:gravity="center" android:orientation="horizontal" @@ -82,7 +83,8 @@ android:layout_height="wrap_content" android:layout_marginEnd="5dp" android:src="@drawable/ic_baseline_fiber_manual_record_24" - app:tint="?android:textColorPrimary" /> + app:tint="?android:textColorPrimary" + tools:ignore="ContentDescription" /> <ImageView android:id="@+id/engineStopIcon" @@ -91,7 +93,8 @@ android:layout_toEndOf="@id/statusIcon" android:visibility="gone" android:layout_marginEnd="5dp" - android:src="@drawable/ic_baseline_lock_24" /> + android:src="@drawable/ic_baseline_lock_24" + tools:ignore="ContentDescription" /> <TextView android:id="@+id/unitName" diff --git a/androidApp/src/main/res/layout/unit_map_fragment.xml b/androidApp/src/main/res/layout/unit_map_fragment.xml index f2d54e6..0b0dcbc 100644 --- a/androidApp/src/main/res/layout/unit_map_fragment.xml +++ b/androidApp/src/main/res/layout/unit_map_fragment.xml @@ -26,22 +26,171 @@ app:cardUseCompatPadding="true" app:cardElevation="@dimen/card_elevation" app:cardCornerRadius="@dimen/card_border_radius" - app:contentPadding="@dimen/card_padding" + app:contentPaddingTop="@dimen/card_padding" + app:contentPaddingLeft="@dimen/card_padding" + app:contentPaddingRight="@dimen/card_padding" android:visibility="gone"> - <LinearLayout + <RelativeLayout + android:id="@+id/mainContent" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical"> + android:animateLayoutChanges="true"> + + <ImageView + android:id="@+id/statusIcon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="5dp" + android:src="@drawable/ic_baseline_fiber_manual_record_24" + app:tint="?android:textColorPrimary" + tools:ignore="ContentDescription" /> + + <ImageView + android:id="@+id/engineStopIcon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_toEndOf="@id/statusIcon" + android:visibility="gone" + android:layout_marginEnd="5dp" + android:src="@drawable/ic_baseline_lock_24" + tools:ignore="ContentDescription" /> <TextView - android:id="@+id/unitInfoTest" + android:id="@+id/unitName" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_toEndOf="@id/engineStopIcon" + style="@style/TextAppearance.AppCompat.Body2" + tools:text="1AAUTO" /> + + <GridLayout + android:id="@+id/gridLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@id/unitName"> + + <ImageView + android:id="@+id/driverNameIcon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginEnd="6dp" + android:layout_column="0" + android:layout_row="1" + android:contentDescription="@string/unit_driver_name" + android:src="@drawable/ic_baseline_person_24" + app:tint="?android:textColorSecondary" /> + + <TextView + android:id="@+id/driverName" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_row="1" + style="@style/TextAppearance.AppCompat.Caption" + tools:text="Javier Zavala" /> + + <ImageView + android:id="@+id/unitSpeedIcon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="0" + android:layout_row="2" + style="@style/TextAppearance.MaterialComponents.Caption" + android:contentDescription="@string/unit_speed" + android:src="@drawable/ic_baseline_speed_24" + app:tint="?android:textColorSecondary" /> + + <TextView + android:id="@+id/unitSpeed" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_row="2" + style="@style/TextAppearance.AppCompat.Caption" + tools:text="0 Km/h - Stopped" /> + + <ImageView + android:id="@+id/lastAddressIcon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="0" + android:layout_row="3" + android:contentDescription="@string/unit_last_address" + android:src="@drawable/ic_baseline_location_on_24" + app:tint="?android:textColorSecondary" /> + + <TextView + android:id="@+id/lastAddress" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_row="3" + style="@style/TextAppearance.AppCompat.Caption" + tools:text="404 Av. Arboledas, Celaya, Gto." /> + + <ImageView + android:id="@+id/lastDateIcon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="0" + android:layout_row="4" + android:contentDescription="@string/unit_last_date" + android:src="@drawable/ic_baseline_calendar_today_24" + app:tint="?android:textColorSecondary" /> + + + <TextView + android:id="@+id/lastDate" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_row="4" + style="@style/TextAppearance.AppCompat.Caption" + tools:text="4 de Diciembre de 2021, 7:00 PM" /> + + </GridLayout> + + <LinearLayout + android:id="@+id/itemOptions" android:layout_width="match_parent" android:layout_height="wrap_content" - tools:text="SELECTED UNIT" - android:gravity="center"/> + android:layout_below="@id/gridLayout" + android:gravity="center" + android:orientation="horizontal" + android:visibility="visible"> + + <com.google.android.material.button.MaterialButton + android:id="@+id/detailsButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/unit_details" + android:textColor="@color/colorAccent" + style="?borderlessButtonStyle" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/reportsButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginHorizontal="8dp" + android:layout_weight="1" + android:text="@string/unit_reports" + android:textColor="@color/colorAccent" + style="?borderlessButtonStyle" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/commandsButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="1" + android:text="@string/unit_commands" + android:textColor="@color/colorAccent" + style="?borderlessButtonStyle" /> + + </LinearLayout> - </LinearLayout> + </RelativeLayout> </androidx.cardview.widget.CardView> diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MarkerType.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MarkerType.kt new file mode 100644 index 0000000..ba8541f --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MarkerType.kt @@ -0,0 +1,6 @@ +package mx.trackermap.TrackerMap.utils + +enum class MarkerType { + ANIMAL, BICYCLE, BOAT, BUS, CAR, CRANE, DEFAULT, HELICOPTER, MOTORCYCLE, OFFROAD, PERSON, + PICKUP, PLANE, SCOOTER, SHIP, TRACTOR, TRAIN, TRAM, TROLLEYBUS, TRUCK, VAN +}
\ No newline at end of file |