From 9e5b46dc536e70cb5193e0a3dad6100cfab6a7d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 23 Feb 2026 16:17:49 -0500 Subject: [PATCH 1/3] Vehicle location report timestamp instant / countdown duration - https://github.com/mtransitapps/mtransit-for-android/pull/118 --- .../org/mtransit/android/commons/TimeUtilsK.kt | 4 ++++ .../GTFSRealTimeVehiclePositionsProvider.kt | 3 ++- .../NextBusVehicleLocationsProvider.kt | 13 +++++++------ .../vehiclelocations/model/VehicleLocation.kt | 17 ++++++++++------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt b/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt index 683c8d9f..9dff11db 100644 --- a/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt +++ b/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt @@ -25,4 +25,8 @@ object TimeUtilsK { fun Long.toInstant() = Instant.fromEpochMilliseconds(this) +fun Long.secsToInstant() = Instant.fromEpochSeconds(this) + fun Instant.toMillis() = this.toEpochMilliseconds() + +fun Instant.toSecs() = this.epochSeconds diff --git a/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/GTFSRealTimeVehiclePositionsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/GTFSRealTimeVehiclePositionsProvider.kt index 50decd5a..4725d551 100644 --- a/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/GTFSRealTimeVehiclePositionsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/GTFSRealTimeVehiclePositionsProvider.kt @@ -38,6 +38,7 @@ import org.mtransit.android.commons.provider.gtfs.routeIdCleanupPattern import org.mtransit.android.commons.provider.gtfs.tripIdCleanupPattern import org.mtransit.android.commons.provider.vehiclelocations.VehicleLocationProvider.Companion.getCachedVehicleLocationsS import org.mtransit.android.commons.provider.vehiclelocations.model.VehicleLocation +import org.mtransit.android.commons.secsToInstant import java.net.HttpURLConnection import java.net.SocketException import java.net.UnknownHostException @@ -240,7 +241,7 @@ object GTFSRealTimeVehiclePositionsProvider { // vehicleId = gVehiclePosition.optVehicle?.optId, vehicleLabel = gVehiclePosition.optVehicle?.optLabel, - reportTimestamp = gVehiclePosition.optTimestamp?.seconds, + reportTimestamp = gVehiclePosition.optTimestamp?.secsToInstant(), latitude = gVehiclePosition.optPosition?.optLatitude ?: return null, longitude = gVehiclePosition.optPosition?.optLongitude ?: return null, bearingDegrees = gVehiclePosition.optPosition?.optBearing?.toInt(), // in degrees diff --git a/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/NextBusVehicleLocationsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/NextBusVehicleLocationsProvider.kt index 785fbc02..d4fa5e78 100644 --- a/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/NextBusVehicleLocationsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/NextBusVehicleLocationsProvider.kt @@ -4,6 +4,7 @@ import android.content.Context import org.mtransit.android.commons.Constants import org.mtransit.android.commons.MTLog import org.mtransit.android.commons.TimeUtils +import org.mtransit.android.commons.TimeUtilsK import org.mtransit.android.commons.data.Route import org.mtransit.android.commons.data.RouteDirection import org.mtransit.android.commons.data.RouteDirectionStop @@ -16,15 +17,15 @@ import org.mtransit.android.commons.provider.nextbus.api.NextBusApi import org.mtransit.android.commons.provider.nextbus.api.VehicleLocationsResponse import org.mtransit.android.commons.provider.vehiclelocations.VehicleLocationProvider.Companion.getCachedVehicleLocationsS import org.mtransit.android.commons.provider.vehiclelocations.model.VehicleLocation +import org.mtransit.android.commons.toMillis import java.net.HttpURLConnection import java.net.SocketException import java.net.UnknownHostException import kotlin.math.min -import kotlin.time.Duration import kotlin.time.Duration.Companion.hours -import kotlin.time.Duration.Companion.milliseconds import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds +import kotlin.time.Instant object NextBusVehicleLocationsProvider { @@ -151,8 +152,8 @@ object NextBusVehicleLocationsProvider { .getVehicleLocations(agencyTag = agencyTag) .execute() NextBusStorage.saveVehicleLocationLastUpdateCode(context, response.code()) - val newLastUpdate = TimeUtils.currentTimeMillis().milliseconds - NextBusStorage.saveVehicleLocationLastUpdateMs(context, newLastUpdate.inWholeMilliseconds) + val newLastUpdate = TimeUtilsK.currentInstant() + NextBusStorage.saveVehicleLocationLastUpdateMs(context, newLastUpdate.toMillis()) when (response.code()) { HttpURLConnection.HTTP_OK -> { val vehicleLocations = mutableListOf() @@ -209,7 +210,7 @@ object NextBusVehicleLocationsProvider { } private fun NextBusProvider.processVehiclePositions( - newLastUpdate: Duration, + newLastUpdate: Instant, nVehicle: VehicleLocationsResponse.Vehicle, ): Set? { val targetUUIDs = parseProviderTargetUUID(nVehicle)?.takeIf { it.isNotBlank() } ?: return null @@ -218,7 +219,7 @@ object NextBusVehicleLocationsProvider { authority = this.authority, targetUUID = targetUUIDs, targetTripId = null, // no GTFS trip.id info returned - lastUpdateInMs = newLastUpdate.inWholeMilliseconds, + lastUpdateInMs = newLastUpdate.toMillis(), maxValidityInMs = this@processVehiclePositions.vehicleLocationMaxValidityInMs, // vehicleId = nVehicle.id, diff --git a/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/model/VehicleLocation.kt b/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/model/VehicleLocation.kt index 1f63e3be..07ba8287 100644 --- a/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/model/VehicleLocation.kt +++ b/src/main/java/org/mtransit/android/commons/provider/vehiclelocations/model/VehicleLocation.kt @@ -3,6 +3,7 @@ package org.mtransit.android.commons.provider.vehiclelocations.model import android.content.ContentValues import android.database.Cursor import org.mtransit.android.commons.TimeUtils +import org.mtransit.android.commons.TimeUtilsK import org.mtransit.android.commons.getFloat import org.mtransit.android.commons.getLong import org.mtransit.android.commons.getString @@ -10,9 +11,11 @@ import org.mtransit.android.commons.optInt import org.mtransit.android.commons.optLong import org.mtransit.android.commons.optString import org.mtransit.android.commons.provider.vehiclelocations.VehicleLocationProviderContract +import org.mtransit.android.commons.secsToInstant +import org.mtransit.android.commons.toMillis +import org.mtransit.android.commons.toSecs import kotlin.time.Duration -import kotlin.time.Duration.Companion.milliseconds -import kotlin.time.Duration.Companion.seconds +import kotlin.time.Instant /** * See [VehicleLocationProviderContract] @@ -27,19 +30,19 @@ data class VehicleLocation( // val vehicleId: String?, // not user visible val vehicleLabel: String?, // user visible - val reportTimestamp: Duration?, // in SECONDS + val reportTimestamp: Instant?, val latitude: Float, val longitude: Float, val bearingDegrees: Int?, // in degrees val speedMetersPerSecond: Int?, // in m/s ) { - val reportTimestampSec: Long? get() = reportTimestamp?.inWholeSeconds + val reportTimestampSec: Long? get() = reportTimestamp?.toSecs() @Suppress("unused") - val reportTimestampMs: Long? get() = reportTimestamp?.inWholeMilliseconds + val reportTimestampMs: Long? get() = reportTimestamp?.toMillis() - val reportTimestampCountdown: Duration? get() = reportTimestamp?.let { (TimeUtils.currentTimeMillis().milliseconds - it) } + val reportTimestampCountdown: Duration? get() = reportTimestamp?.let { (TimeUtilsK.currentInstant() - it) } private val _uid: String? = this.vehicleId ?: this.vehicleLabel @@ -57,7 +60,7 @@ data class VehicleLocation( // vehicleId = cursor.optString(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_VEHICLE_ID), vehicleLabel = cursor.optString(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_VEHICLE_LABEL), - reportTimestamp = cursor.optLong(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_VEHICLE_REPORT_TIMESTAMP)?.seconds, + reportTimestamp = cursor.optLong(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_VEHICLE_REPORT_TIMESTAMP)?.secsToInstant(), latitude = cursor.getFloat(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_LATITUDE), longitude = cursor.getFloat(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_LONGITUDE), bearingDegrees = cursor.optInt(VehicleLocationProviderContract.Columns.T_VEHICLE_LOCATION_K_BEARING), From f7856ead78c7071d5b621c0668e0fe8721ca175d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Tue, 24 Feb 2026 08:27:00 -0500 Subject: [PATCH 2/3] PR comments --- src/main/java/org/mtransit/android/commons/TimeUtilsK.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt b/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt index 9dff11db..eb737e73 100644 --- a/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt +++ b/src/main/java/org/mtransit/android/commons/TimeUtilsK.kt @@ -20,10 +20,10 @@ object TimeUtilsK { if (negative) insert(0, "-") }.trim() - fun currentInstant() = TimeUtils.currentTimeMillis().toInstant() + fun currentInstant() = TimeUtils.currentTimeMillis().millisToInstant() } -fun Long.toInstant() = Instant.fromEpochMilliseconds(this) +fun Long.millisToInstant() = Instant.fromEpochMilliseconds(this) fun Long.secsToInstant() = Instant.fromEpochSeconds(this) From 9001721f463af536e30fcf05ac0e7097289c3215 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 25 Feb 2026 14:15:10 -0500 Subject: [PATCH 3/3] Security provider > logs++ --- .../mtransit/android/commons/provider/StmInfoApiProvider.java | 2 ++ .../android/commons/provider/agency/AgencyProvider.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java b/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java index 40c86cf2..e05347b9 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java @@ -1424,6 +1424,8 @@ private void updateSecurityProviderIfNeeded(@Nullable Context context) { try { if (context != null) { ProviderInstaller.installIfNeededAsync(context, this); + } else { + MTLog.i(this, "Cannot update security provider (no context)."); } } catch (Exception e) { MTLog.w(this, e, "Unexpected error while updating security provider!"); diff --git a/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java index ca55aceb..3cc4069b 100644 --- a/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java @@ -358,6 +358,8 @@ private void updateSecurityProviderIfNeeded(@Nullable Context context) { try { if (context != null) { ProviderInstaller.installIfNeededAsync(context, this); + } else { + MTLog.i(this, "Cannot update security provider (no context)."); } } catch (Exception e) { MTLog.w(this, e, "Unexpected error while updating security provider!");