From 99aae86ff02cba6ea08b0eb3e4da539c3caa766d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 27 Apr 2026 09:47:18 -0400 Subject: [PATCH 1/4] Compat w/ `gtfs_rts_agency_id_cleanup_regex` - https://github.com/mtransitapps/parser/pull/63 --- .../provider/GTFSRealTimeProvider.java | 36 ++++++++++++++++--- .../provider/gtfs/GTFSRealTimeProviderExt.kt | 9 +++-- src/main/res/values/gtfs_rts_values_gen.xml | 1 + 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java index 4c9f0ae3..f6b2c086 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -442,6 +442,20 @@ public static boolean isIGNORE_DIRECTION(@NonNull Context context) { return ignoreDirection; } + @Nullable + private static String agencyIdCleanupRegex = null; + + /** + * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. + */ + @NonNull + private static String getAGENCY_ID_CLEANUP_REGEX(@NonNull Context context) { + if (agencyIdCleanupRegex == null) { + agencyIdCleanupRegex = context.getResources().getString(R.string.gtfs_rts_agency_id_cleanup_regex); // do not change to avoid breaking compat w/ old modules + } + return agencyIdCleanupRegex; + } + @Nullable private static String serviceIdCleanupRegex = null; @@ -1005,14 +1019,12 @@ private HashSet processAlerts( for (GtfsRealtime.EntitySelector gInformedEntity : gInformedEntityList) { if (gInformedEntity.hasAgencyId() && !providerAgencyId.isEmpty() - && !providerAgencyId.equals(gInformedEntity.getAgencyId())) { - MTLog.w(this, "processAlerts() > Alert targets another agency: %s", gInformedEntity.getAgencyId()); + && !providerAgencyId.equals(GTFSRealTimeProviderExtKt.parseAgencyId(this, gInformedEntity))) { + MTLog.w(this, "processAlerts() > Alert targets another agency: '%s'!", gInformedEntity.getAgencyId()); continue; } final String targetUUID = GTFSRealTimeServiceAlertsProvider.parseProviderTargetUUID(this, gInformedEntity, ignoreDirection); - if (targetUUID == null || targetUUID.isEmpty()) { - continue; - } + if (targetUUID == null || targetUUID.isEmpty()) continue; final String targetTripId = !FeatureFlags.F_USE_TRIP_IS_FOR_SERVICE_UPDATES ? null : GTFSRealTimeServiceAlertsProvider.parseTargetTripId(this, gInformedEntity); targetUUIDAndTripId.put(targetUUID, targetTripId); final int severity = GTFSRTAlertsManager.parseSeverity(gInformedEntity, gEffect); @@ -1288,6 +1300,20 @@ private ArrayMap parseTranslations(@NonNull GtfsRealtime.Transla return translations; } + @Nullable + private Pattern agencyIdCleanupPattern = null; + + private boolean agencyIdCleanupPatternSet = false; + + @Nullable + public Pattern getAgencyIdCleanupPattern(@NonNull Context context) { + if (this.agencyIdCleanupPattern == null && !agencyIdCleanupPatternSet) { + this.agencyIdCleanupPattern = GTFSCommons.makeIdCleanupPattern(getAGENCY_ID_CLEANUP_REGEX(context)); + this.agencyIdCleanupPatternSet = true; + } + return this.agencyIdCleanupPattern; + } + @Nullable private Pattern serviceIdCleanupPattern = null; diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt index c8299e1c..3a11f685 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt @@ -25,6 +25,7 @@ import org.mtransit.android.commons.provider.GTFSRealTimeProvider.getAgencyTagTa import org.mtransit.android.commons.provider.GTFSRealTimeProvider.getTARGET_AUTHORITY import org.mtransit.android.commons.provider.GTFSRealTimeProvider.isIGNORE_DIRECTION import org.mtransit.android.commons.provider.GTFSRealTimeProvider.isUSE_URL_HASH_SECRET_AND_DATE +import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optAgencyId import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optRouteId import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optStopId import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optTripId @@ -40,14 +41,18 @@ val GTFSRealTimeProvider.ignoreDirection get() = isIGNORE_DIRECTION(requireConte val GTFSRealTimeProvider.targetAuthority get() = getTARGET_AUTHORITY(requireContextCompat()) val GTFSRealTimeProvider.timeZone get() = getAGENCY_TIME_ZONE(requireContextCompat()) -private val GTFSRealTimeProvider.routeIdCleanupPattern get() = getRouteIdCleanupPattern(requireContextCompat()) +fun GTFSRealTimeProvider.parseAgencyId(es: GEntitySelector) = es.optAgencyId?.let { parseAgencyId(it) } +fun GTFSRealTimeProvider.parseAgencyId(gRouteId: String) = gRouteId.originalIdToId(agencyIdCleanupPattern) +private val GTFSRealTimeProvider.agencyIdCleanupPattern get() = getAgencyIdCleanupPattern(requireContextCompat()) + fun GTFSRealTimeProvider.parseRouteId(es: GEntitySelector) = es.optRouteId?.let { parseRouteId(it) } fun GTFSRealTimeProvider.parseRouteId(td: GTripDescriptor) = td.optRouteId?.let { parseRouteId(it) } fun GTFSRealTimeProvider.parseRouteId(gRouteId: String) = gRouteId.originalIdToHash(routeIdCleanupPattern) +private val GTFSRealTimeProvider.routeIdCleanupPattern get() = getRouteIdCleanupPattern(requireContextCompat()) -private val GTFSRealTimeProvider.tripIdCleanupPattern get() = getTripIdCleanupPattern(requireContextCompat()) fun GTFSRealTimeProvider.parseTripId(td: GTripDescriptor) = td.optTripId?.let { parseTripId(it) } fun GTFSRealTimeProvider.parseTripId(gTripId: String) = gTripId.originalIdToId(tripIdCleanupPattern) +private val GTFSRealTimeProvider.tripIdCleanupPattern get() = getTripIdCleanupPattern(requireContextCompat()) @Suppress("unused") fun GTFSRealTimeProvider.parseStopId(stu: GTUStopTimeUpdate) = stu.optStopId?.let { parseStopId(it) } diff --git a/src/main/res/values/gtfs_rts_values_gen.xml b/src/main/res/values/gtfs_rts_values_gen.xml index a527184f..1a56bc74 100644 --- a/src/main/res/values/gtfs_rts_values_gen.xml +++ b/src/main/res/values/gtfs_rts_values_gen.xml @@ -8,6 +8,7 @@ -1 + From dfc84c10b5be07cc96c0e32674736ed05e35a20a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 27 Apr 2026 09:48:29 -0400 Subject: [PATCH 2/4] Compat w/ `gtfs_rts_agency_id_cleanup_regex` - https://github.com/mtransitapps/parser/pull/63 --- .../provider/GTFSRealTimeProvider.java | 36 ++++++++++++++++--- .../provider/gtfs/GTFSRealTimeProviderExt.kt | 9 +++-- src/main/res/values/gtfs_rts_values_gen.xml | 1 + 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java index 4c9f0ae3..f6b2c086 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -442,6 +442,20 @@ public static boolean isIGNORE_DIRECTION(@NonNull Context context) { return ignoreDirection; } + @Nullable + private static String agencyIdCleanupRegex = null; + + /** + * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. + */ + @NonNull + private static String getAGENCY_ID_CLEANUP_REGEX(@NonNull Context context) { + if (agencyIdCleanupRegex == null) { + agencyIdCleanupRegex = context.getResources().getString(R.string.gtfs_rts_agency_id_cleanup_regex); // do not change to avoid breaking compat w/ old modules + } + return agencyIdCleanupRegex; + } + @Nullable private static String serviceIdCleanupRegex = null; @@ -1005,14 +1019,12 @@ private HashSet processAlerts( for (GtfsRealtime.EntitySelector gInformedEntity : gInformedEntityList) { if (gInformedEntity.hasAgencyId() && !providerAgencyId.isEmpty() - && !providerAgencyId.equals(gInformedEntity.getAgencyId())) { - MTLog.w(this, "processAlerts() > Alert targets another agency: %s", gInformedEntity.getAgencyId()); + && !providerAgencyId.equals(GTFSRealTimeProviderExtKt.parseAgencyId(this, gInformedEntity))) { + MTLog.w(this, "processAlerts() > Alert targets another agency: '%s'!", gInformedEntity.getAgencyId()); continue; } final String targetUUID = GTFSRealTimeServiceAlertsProvider.parseProviderTargetUUID(this, gInformedEntity, ignoreDirection); - if (targetUUID == null || targetUUID.isEmpty()) { - continue; - } + if (targetUUID == null || targetUUID.isEmpty()) continue; final String targetTripId = !FeatureFlags.F_USE_TRIP_IS_FOR_SERVICE_UPDATES ? null : GTFSRealTimeServiceAlertsProvider.parseTargetTripId(this, gInformedEntity); targetUUIDAndTripId.put(targetUUID, targetTripId); final int severity = GTFSRTAlertsManager.parseSeverity(gInformedEntity, gEffect); @@ -1288,6 +1300,20 @@ private ArrayMap parseTranslations(@NonNull GtfsRealtime.Transla return translations; } + @Nullable + private Pattern agencyIdCleanupPattern = null; + + private boolean agencyIdCleanupPatternSet = false; + + @Nullable + public Pattern getAgencyIdCleanupPattern(@NonNull Context context) { + if (this.agencyIdCleanupPattern == null && !agencyIdCleanupPatternSet) { + this.agencyIdCleanupPattern = GTFSCommons.makeIdCleanupPattern(getAGENCY_ID_CLEANUP_REGEX(context)); + this.agencyIdCleanupPatternSet = true; + } + return this.agencyIdCleanupPattern; + } + @Nullable private Pattern serviceIdCleanupPattern = null; diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt index c8299e1c..3a11f685 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt @@ -25,6 +25,7 @@ import org.mtransit.android.commons.provider.GTFSRealTimeProvider.getAgencyTagTa import org.mtransit.android.commons.provider.GTFSRealTimeProvider.getTARGET_AUTHORITY import org.mtransit.android.commons.provider.GTFSRealTimeProvider.isIGNORE_DIRECTION import org.mtransit.android.commons.provider.GTFSRealTimeProvider.isUSE_URL_HASH_SECRET_AND_DATE +import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optAgencyId import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optRouteId import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optStopId import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt.optTripId @@ -40,14 +41,18 @@ val GTFSRealTimeProvider.ignoreDirection get() = isIGNORE_DIRECTION(requireConte val GTFSRealTimeProvider.targetAuthority get() = getTARGET_AUTHORITY(requireContextCompat()) val GTFSRealTimeProvider.timeZone get() = getAGENCY_TIME_ZONE(requireContextCompat()) -private val GTFSRealTimeProvider.routeIdCleanupPattern get() = getRouteIdCleanupPattern(requireContextCompat()) +fun GTFSRealTimeProvider.parseAgencyId(es: GEntitySelector) = es.optAgencyId?.let { parseAgencyId(it) } +fun GTFSRealTimeProvider.parseAgencyId(gRouteId: String) = gRouteId.originalIdToId(agencyIdCleanupPattern) +private val GTFSRealTimeProvider.agencyIdCleanupPattern get() = getAgencyIdCleanupPattern(requireContextCompat()) + fun GTFSRealTimeProvider.parseRouteId(es: GEntitySelector) = es.optRouteId?.let { parseRouteId(it) } fun GTFSRealTimeProvider.parseRouteId(td: GTripDescriptor) = td.optRouteId?.let { parseRouteId(it) } fun GTFSRealTimeProvider.parseRouteId(gRouteId: String) = gRouteId.originalIdToHash(routeIdCleanupPattern) +private val GTFSRealTimeProvider.routeIdCleanupPattern get() = getRouteIdCleanupPattern(requireContextCompat()) -private val GTFSRealTimeProvider.tripIdCleanupPattern get() = getTripIdCleanupPattern(requireContextCompat()) fun GTFSRealTimeProvider.parseTripId(td: GTripDescriptor) = td.optTripId?.let { parseTripId(it) } fun GTFSRealTimeProvider.parseTripId(gTripId: String) = gTripId.originalIdToId(tripIdCleanupPattern) +private val GTFSRealTimeProvider.tripIdCleanupPattern get() = getTripIdCleanupPattern(requireContextCompat()) @Suppress("unused") fun GTFSRealTimeProvider.parseStopId(stu: GTUStopTimeUpdate) = stu.optStopId?.let { parseStopId(it) } diff --git a/src/main/res/values/gtfs_rts_values_gen.xml b/src/main/res/values/gtfs_rts_values_gen.xml index a527184f..1a56bc74 100644 --- a/src/main/res/values/gtfs_rts_values_gen.xml +++ b/src/main/res/values/gtfs_rts_values_gen.xml @@ -8,6 +8,7 @@ -1 + From 132c4886b23ea9f5299427d860042ab80047c4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 27 Apr 2026 10:13:38 -0400 Subject: [PATCH 3/4] Update src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt index 3a11f685..5f89f0ec 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt @@ -42,7 +42,7 @@ val GTFSRealTimeProvider.targetAuthority get() = getTARGET_AUTHORITY(requireCont val GTFSRealTimeProvider.timeZone get() = getAGENCY_TIME_ZONE(requireContextCompat()) fun GTFSRealTimeProvider.parseAgencyId(es: GEntitySelector) = es.optAgencyId?.let { parseAgencyId(it) } -fun GTFSRealTimeProvider.parseAgencyId(gRouteId: String) = gRouteId.originalIdToId(agencyIdCleanupPattern) +fun GTFSRealTimeProvider.parseAgencyId(gAgencyId: String) = gAgencyId.originalIdToId(agencyIdCleanupPattern) private val GTFSRealTimeProvider.agencyIdCleanupPattern get() = getAgencyIdCleanupPattern(requireContextCompat()) fun GTFSRealTimeProvider.parseRouteId(es: GEntitySelector) = es.optRouteId?.let { parseRouteId(it) } From 4dc41a47cb91cd63358647c2aed7fca25b164e9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 27 Apr 2026 10:18:31 -0400 Subject: [PATCH 4/4] cleanup --- .../mtransit/android/commons/provider/GTFSRealTimeProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java index f6b2c086..e6caabdd 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -1319,7 +1319,7 @@ public Pattern getAgencyIdCleanupPattern(@NonNull Context context) { private boolean serviceIdCleanupPatternSet = false; - @SuppressWarnings("unused") // TODO use later for trip_updates, vehicle_location... + @SuppressWarnings("unused") @Nullable private Pattern getServiceIdCleanupPattern(@NonNull Context context) { if (this.serviceIdCleanupPattern == null && !serviceIdCleanupPatternSet) {