From edbd2c7713a0ba4e7e7a3ba6d59d16861ea4eb23 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Sun, 17 Sep 2023 21:56:55 -0600 Subject: - [shared] Implement network state monitoring - [android] UI reacts to network state - [ios] UI reacts to network state --- androidApp/src/main/res/layout/login.xml | 247 ++++++++++++---------- androidApp/src/main/res/layout/offline_banner.xml | 15 ++ androidApp/src/main/res/layout/units_activity.xml | 17 +- androidApp/src/main/res/values-es-rMX/strings.xml | 1 + androidApp/src/main/res/values/strings.xml | 1 + 5 files changed, 163 insertions(+), 118 deletions(-) create mode 100644 androidApp/src/main/res/layout/offline_banner.xml (limited to 'androidApp/src/main/res') diff --git a/androidApp/src/main/res/layout/login.xml b/androidApp/src/main/res/layout/login.xml index 78c3e46..816e625 100644 --- a/androidApp/src/main/res/layout/login.xml +++ b/androidApp/src/main/res/layout/login.xml @@ -1,131 +1,150 @@ - - - - - - + android:visibility="gone" + tools:visibility="visible" /> - + + + + + + - - + + - - + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - \ No newline at end of file + android:hint="@string/login_url" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="0.5" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/passwordInputLayout" + app:layout_constraintBottom_toTopOf="@id/signinButton" + android:layout_marginTop="@dimen/fields_spacing"> + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/layout/offline_banner.xml b/androidApp/src/main/res/layout/offline_banner.xml new file mode 100644 index 0000000..6710d08 --- /dev/null +++ b/androidApp/src/main/res/layout/offline_banner.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/androidApp/src/main/res/layout/units_activity.xml b/androidApp/src/main/res/layout/units_activity.xml index 60a77db..8f46516 100644 --- a/androidApp/src/main/res/layout/units_activity.xml +++ b/androidApp/src/main/res/layout/units_activity.xml @@ -15,7 +15,16 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent"/> + app:layout_constraintTop_toTopOf="parent" /> + + + app:layout_constraintTop_toBottomOf="@id/offlineBanner" /> + app:layout_constraintTop_toBottomOf="@id/offlineBanner" /> \ No newline at end of file diff --git a/androidApp/src/main/res/values-es-rMX/strings.xml b/androidApp/src/main/res/values-es-rMX/strings.xml index 912a5d9..59e0408 100644 --- a/androidApp/src/main/res/values-es-rMX/strings.xml +++ b/androidApp/src/main/res/values-es-rMX/strings.xml @@ -19,6 +19,7 @@ Falta la contraseña Falta la URL del servidor Falló el inicio de sesión + No hay conexión a internet Cambiar a lista de dispositivos diff --git a/androidApp/src/main/res/values/strings.xml b/androidApp/src/main/res/values/strings.xml index 57eaf66..93cda7f 100644 --- a/androidApp/src/main/res/values/strings.xml +++ b/androidApp/src/main/res/values/strings.xml @@ -33,6 +33,7 @@ Password is missing Server URL is missing Login failed + No internet connection Switch to device list -- cgit v1.2.3 From 9f9c6b247900a3a08e2b2322896d4f185a12d047 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Wed, 20 Sep 2023 22:32:46 -0600 Subject: - [android] Add direction arrows to reports. - [android] Use DP for marker sizes. --- .../TrackerMap/android/map/MapFragment.kt | 43 +++++++++++++++------- .../android/shared/MarkerTransformations.kt | 19 +++++++++- androidApp/src/main/res/drawable/angle_0.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_135.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_180.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_225.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_270.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_315.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_45.xml | 22 +++++++++++ androidApp/src/main/res/drawable/angle_90.xml | 22 +++++++++++ androidApp/src/main/res/values/dimen.xml | 4 +- .../mx/trackermap/TrackerMap/utils/ReportDates.kt | 14 +------ 12 files changed, 229 insertions(+), 27 deletions(-) create mode 100644 androidApp/src/main/res/drawable/angle_0.xml create mode 100644 androidApp/src/main/res/drawable/angle_135.xml create mode 100644 androidApp/src/main/res/drawable/angle_180.xml create mode 100644 androidApp/src/main/res/drawable/angle_225.xml create mode 100644 androidApp/src/main/res/drawable/angle_270.xml create mode 100644 androidApp/src/main/res/drawable/angle_315.xml create mode 100644 androidApp/src/main/res/drawable/angle_45.xml create mode 100644 androidApp/src/main/res/drawable/angle_90.xml (limited to 'androidApp/src/main/res') 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 4915c49..2be9bb4 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 @@ -40,6 +40,7 @@ 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 kotlin.math.atan2 typealias SetupCallback = () -> Unit typealias MarkerCallback = (Int?) -> Unit @@ -186,11 +187,14 @@ open class MapFragment : GlobeMapFragment() { 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 vectorWidth = requireContext().resources.getDimensionPixelSize(R.dimen.report_label_width).toFloat() + + val markerSize = requireContext().resources.getDimensionPixelSize(R.dimen.marker_size).toDouble() + val vertexSize = requireContext().resources.getDimensionPixelSize(R.dimen.vertex_size).toDouble() val vectorInfo = VectorInfo() - vectorInfo.setColor(colorReport) - vectorInfo.setLineWidth(vectorWidth ?: 20f) + vectorInfo.color = colorReport + vectorInfo.lineWidth = vectorWidth val labelInfo = LabelInfo() labelInfo.typeface = Typeface.DEFAULT_BOLD @@ -210,17 +214,17 @@ open class MapFragment : GlobeMapFragment() { when (i) { 0 -> getIcon(Marker.Type.REPORT_START) markers.size - 1 -> getIcon(Marker.Type.REPORT_END) - else -> getIcon(Marker.Type.REPORT_POSITION) + else -> getIconForDirection(points[i], points[i + 1]) } } else getIcon(marker.type) screenMarker.size = if (isReport) { // For reports, position, start and end, size must be different when (i) { - 0 -> Point2d(144.0, 144.0) - markers.size - 1 -> Point2d(144.0, 144.0) - else -> Point2d(82.0, 82.0) + 0 -> Point2d(markerSize, markerSize) + markers.size - 1 -> Point2d(markerSize, markerSize) + else -> Point2d(vertexSize, vertexSize) } - } else Point2d(144.0, 144.0) + } else Point2d(markerSize, markerSize) screenMarker.userObject = marker.id screenMarker.selectable = true @@ -292,11 +296,11 @@ open class MapFragment : GlobeMapFragment() { 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 vectorWidth = requireContext().resources.getDimensionPixelSize(R.dimen.geofence_label_width).toFloat() val vectorInfo = VectorInfo() - vectorInfo.setColor(colorFill) - vectorInfo.setLineWidth(vectorWidth ?: 4f) + vectorInfo.color = colorFill + vectorInfo.lineWidth = vectorWidth val labelInfo = LabelInfo() labelInfo.typeface = Typeface.DEFAULT_BOLD @@ -334,7 +338,7 @@ open class MapFragment : GlobeMapFragment() { } } } - } catch (e: SFException) {} + } catch (_: SFException) {} } } @@ -427,9 +431,22 @@ open class MapFragment : GlobeMapFragment() { } private fun getIcon(markerType: Marker.Type): Bitmap { + val markerSize = requireContext().resources.getDimensionPixelSize(R.dimen.marker_size) return ResourcesCompat.getDrawable( requireActivity().resources, MarkerTransformations.markerTypeToResourceId(markerType), - requireActivity().theme)!!.toBitmap(144, 144) + requireActivity().theme)!!.toBitmap(markerSize, markerSize) + } + + private fun getIconForDirection(a: Point2d, b: Point2d): Bitmap { + val vertexSize = requireContext().resources.getDimensionPixelSize(R.dimen.vertex_size) + val vectorX = b.x - a.x + val vectorY = b.y - a.y + val angleRad = atan2(vectorY, vectorX) + return ResourcesCompat.getDrawable( + requireActivity().resources, + MarkerTransformations.angleToResourceId(angleRad), + requireActivity().theme + )!!.toBitmap(vertexSize, vertexSize) } } \ No newline at end of file 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 1e5c4de..88cb422 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 @@ -19,6 +19,7 @@ package mx.trackermap.TrackerMap.android.shared import mx.trackermap.TrackerMap.android.R import mx.trackermap.TrackerMap.client.models.Marker +import kotlin.math.PI object MarkerTransformations { fun markerTypeToResourceId(markerType: Marker.Type): Int { @@ -51,7 +52,7 @@ object MarkerTransformations { } } - fun markerTypeToStringId(markerType: Marker.Type): Int { + private fun markerTypeToStringId(markerType: Marker.Type): Int { return when (markerType) { Marker.Type.ANIMAL -> R.string.unit_category_animal Marker.Type.BICYCLE -> R.string.unit_category_bicycle @@ -85,4 +86,20 @@ object MarkerTransformations { fun categoryToStringId(category: String?): Int { return markerTypeToStringId(Marker.categoryToMarkerType(category)) } + + private const val STEP = PI / 8 + + @OptIn(ExperimentalStdlibApi::class) + fun angleToResourceId(rad: Double): Int = when (rad) { + in 0.0 ..< STEP -> R.drawable.angle_0 + in STEP ..< STEP * 3 -> R.drawable.angle_45 + in STEP * 3 ..< STEP * 5 -> R.drawable.angle_90 + in STEP * 5 ..< STEP * 7 -> R.drawable.angle_135 + in STEP * 7 ..< STEP * 9 -> R.drawable.angle_180 + in STEP * 9 ..< STEP * 11 -> R.drawable.angle_225 + in STEP * 11 ..< STEP * 13 -> R.drawable.angle_270 + in STEP * 13 ..< STEP * 15 -> R.drawable.angle_315 + in STEP * 15 ..< STEP * 16 -> R.drawable.angle_0 + else -> angleToResourceId(PI * 2 + rad) + } } \ No newline at end of file diff --git a/androidApp/src/main/res/drawable/angle_0.xml b/androidApp/src/main/res/drawable/angle_0.xml new file mode 100644 index 0000000..53957d9 --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_0.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_135.xml b/androidApp/src/main/res/drawable/angle_135.xml new file mode 100644 index 0000000..cd1b88e --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_135.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_180.xml b/androidApp/src/main/res/drawable/angle_180.xml new file mode 100644 index 0000000..f3fca08 --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_180.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_225.xml b/androidApp/src/main/res/drawable/angle_225.xml new file mode 100644 index 0000000..bd7c512 --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_225.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_270.xml b/androidApp/src/main/res/drawable/angle_270.xml new file mode 100644 index 0000000..19db1cf --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_270.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_315.xml b/androidApp/src/main/res/drawable/angle_315.xml new file mode 100644 index 0000000..3186db0 --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_315.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_45.xml b/androidApp/src/main/res/drawable/angle_45.xml new file mode 100644 index 0000000..9d8b5a9 --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_45.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/drawable/angle_90.xml b/androidApp/src/main/res/drawable/angle_90.xml new file mode 100644 index 0000000..44dae03 --- /dev/null +++ b/androidApp/src/main/res/drawable/angle_90.xml @@ -0,0 +1,22 @@ + + + + + diff --git a/androidApp/src/main/res/values/dimen.xml b/androidApp/src/main/res/values/dimen.xml index 8c8c5f5..4afaf23 100644 --- a/androidApp/src/main/res/values/dimen.xml +++ b/androidApp/src/main/res/values/dimen.xml @@ -29,10 +29,12 @@ 64dp + 55dp + 24dp 11sp 11sp 4dp - 10dp + 12dp 11sp diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/ReportDates.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/ReportDates.kt index 5298df3..d261d07 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/ReportDates.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/ReportDates.kt @@ -22,20 +22,10 @@ import kotlinx.datetime.* @DelicateCoroutinesApi class ReportDates { - enum class PeriodTypes { - TODAY, - LAST_24, - YESTERDAY, - THIS_WEEK, - LAST_7, - THIS_MONTH, - LAST_30, - CUSTOM - } sealed class ReportPeriod { val timezone = TimeZone.currentSystemDefault() - val clock = Clock.System + private val clock = Clock.System val instant = clock.now() val dateTime = instant.toLocalDateTime(timezone) val date = dateTime.date @@ -47,7 +37,7 @@ class ReportDates { return formatDateTime(from) to formatDateTime(to) } - fun formatDateTime(dateTime: LocalDateTime) = + private fun formatDateTime(dateTime: LocalDateTime) = dateTime.toInstant(timezone).toString() class Today : ReportPeriod() { -- cgit v1.2.3