From 97c83cd0ddffa507b0568250fccc31f34acbb8f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Wed, 12 Nov 2025 21:48:03 -0500 Subject: [PATCH 1/5] Index Service IDs --- .../provider/GTFSProviderDbHelper.java | 30 +++++++++++++++++-- .../raw/current_gtfs_schedule_service_ids | 0 .../raw/next_gtfs_schedule_service_ids | 0 src/main/res/raw/gtfs_schedule_service_ids | 0 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/main/res-current/raw/current_gtfs_schedule_service_ids create mode 100644 src/main/res-next/raw/next_gtfs_schedule_service_ids create mode 100644 src/main/res/raw/gtfs_schedule_service_ids diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java index eb3a6826..6f2c24b6 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java @@ -80,6 +80,13 @@ public String getLogTag() { private static final String T_DIRECTION_STOPS_SQL_INSERT = GTFSCommons.getT_DIRECTION_STOPS_SQL_INSERT(); private static final String T_DIRECTION_STOPS_SQL_DROP = GTFSCommons.getT_DIRECTION_STOPS_SQL_DROP(); + static final String T_SERVICE_IDS = GTFSCommons.T_SERVICE_IDS; + static final String T_SERVICE_IDS_K_ID = GTFSCommons.T_SERVICE_IDS_K_ID; + static final String T_SERVICE_IDS_K_ID_INT = GTFSCommons.T_SERVICE_IDS_K_ID_INT; + private static final String T_SERVICE_IDS_SQL_CREATE = GTFSCommons.getT_SERVICE_IDS_SQL_CREATE(); + private static final String T_SERVICE_IDS_SQL_INSERT = GTFSCommons.getT_SERVICE_IDS_SQL_INSERT(); + private static final String T_SERVICE_IDS_SQL_DROP = GTFSCommons.getT_SERVICE_IDS_SQL_DROP(); + static final String T_SERVICE_DATES = GTFSCommons.T_SERVICE_DATES; static final String T_SERVICE_DATES_K_SERVICE_ID = GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID; static final String T_SERVICE_DATES_K_DATE = GTFSCommons.T_SERVICE_DATES_K_DATE; @@ -136,7 +143,7 @@ public boolean isDbExist(@NonNull Context context) { private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { MTLog.i(this, "Data: deploying DB..."); int nId = TimeUtils.currentTimeSec(); - int nbTotalOperations = 6; + int nbTotalOperations = 7; final NotificationManagerCompat nm = NotificationManagerCompat.from(this.context); final boolean notifEnabled = nm.areNotificationsEnabled(); final NotificationCompat.Builder nb; @@ -175,10 +182,14 @@ private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { if (notifEnabled) { NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 5); } + initDbTableWithRetry(db, T_SERVICE_IDS, T_SERVICE_IDS_SQL_CREATE, T_SERVICE_IDS_SQL_INSERT, T_SERVICE_IDS_SQL_DROP, getServiceIdsFiles()); + if (notifEnabled) { + NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 6); + } db.execSQL(T_ROUTE_DIRECTION_STOP_STATUS_SQL_CREATE); if (notifEnabled) { nb.setSmallIcon(android.R.drawable.stat_notify_sync_noanim); // - NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 6); + NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 7); nm.cancel(nId); } MTLog.i(this, "Data: deploying DB... DONE"); @@ -238,6 +249,21 @@ private boolean initDbTable(@NonNull SQLiteDatabase db, String table, String sql } } + /** + * Override if multiple {@link GTFSProviderDbHelper} implementations in same app. + */ + private int[] getServiceIdsFiles() { + if (GTFSCurrentNextProvider.hasCurrentData(context)) { + if (GTFSCurrentNextProvider.isNextData(context)) { + return new int[]{R.raw.next_gtfs_schedule_service_ids}; + } else { // CURRENT = default + return new int[]{R.raw.current_gtfs_schedule_service_ids}; + } + } else { + return new int[]{R.raw.gtfs_schedule_service_ids}; + } + } + /** * Override if multiple {@link GTFSProviderDbHelper} implementations in same app. */ diff --git a/src/main/res-current/raw/current_gtfs_schedule_service_ids b/src/main/res-current/raw/current_gtfs_schedule_service_ids new file mode 100644 index 00000000..e69de29b diff --git a/src/main/res-next/raw/next_gtfs_schedule_service_ids b/src/main/res-next/raw/next_gtfs_schedule_service_ids new file mode 100644 index 00000000..e69de29b diff --git a/src/main/res/raw/gtfs_schedule_service_ids b/src/main/res/raw/gtfs_schedule_service_ids new file mode 100644 index 00000000..e69de29b From ac688938d6b30e9f8a1c2d97d383cc0dab5f08fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 14 Nov 2025 21:11:28 -0500 Subject: [PATCH 2/5] wip --- .../provider/GTFSProviderDbHelper.java | 9 ++++-- .../commons/provider/GTFSStatusProvider.java | 32 +++++++++++++------ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java index 6f2c24b6..91937ff9 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java @@ -15,6 +15,7 @@ import org.mtransit.android.commons.R; import org.mtransit.android.commons.SqlUtils; import org.mtransit.android.commons.TimeUtils; +import org.mtransit.commons.FeatureFlags; import org.mtransit.commons.GTFSCommons; import org.mtransit.commons.sql.SQLUtils; @@ -89,6 +90,7 @@ public String getLogTag() { static final String T_SERVICE_DATES = GTFSCommons.T_SERVICE_DATES; static final String T_SERVICE_DATES_K_SERVICE_ID = GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID; + static final String T_SERVICE_DATES_K_SERVICE_ID_INT = GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID_INT; static final String T_SERVICE_DATES_K_DATE = GTFSCommons.T_SERVICE_DATES_K_DATE; static final String T_SERVICE_DATES_K_EXCEPTION_TYPE = GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE; private static final String T_SERVICE_DATES_SQL_CREATE = GTFSCommons.getT_SERVICE_DATES_SQL_CREATE(); @@ -130,6 +132,9 @@ public void onUpgradeMT(@NonNull SQLiteDatabase db, int oldVersion, int newVersi db.execSQL(T_STOP_SQL_DROP); db.execSQL(T_DIRECTION_SQL_DROP); db.execSQL(T_ROUTE_SQL_DROP); + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + db.execSQL(T_SERVICE_IDS_SQL_DROP); + } db.execSQL(T_SERVICE_DATES_SQL_DROP); db.execSQL(T_ROUTE_DIRECTION_STOP_STATUS_SQL_DROP); initAllDbTables(db, true); @@ -178,11 +183,11 @@ private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { if (notifEnabled) { NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 4); } - initDbTableWithRetry(db, T_SERVICE_DATES, T_SERVICE_DATES_SQL_CREATE, T_SERVICE_DATES_SQL_INSERT, T_SERVICE_DATES_SQL_DROP, getServiceDatesFiles()); + initDbTableWithRetry(db, T_SERVICE_IDS, T_SERVICE_IDS_SQL_CREATE, T_SERVICE_IDS_SQL_INSERT, T_SERVICE_IDS_SQL_DROP, getServiceIdsFiles()); if (notifEnabled) { NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 5); } - initDbTableWithRetry(db, T_SERVICE_IDS, T_SERVICE_IDS_SQL_CREATE, T_SERVICE_IDS_SQL_INSERT, T_SERVICE_IDS_SQL_DROP, getServiceIdsFiles()); + initDbTableWithRetry(db, T_SERVICE_DATES, T_SERVICE_DATES_SQL_CREATE, T_SERVICE_DATES_SQL_INSERT, T_SERVICE_DATES_SQL_DROP, getServiceDatesFiles()); if (notifEnabled) { NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, 6); } diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java index 80c1db30..faaf1a54 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java @@ -24,6 +24,7 @@ import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; import org.mtransit.android.commons.provider.agency.AgencyUtils; +import org.mtransit.commons.FeatureFlags; import org.mtransit.commons.GTFSCommons; import java.io.BufferedReader; @@ -391,8 +392,12 @@ static HashSet findScheduleList(@NonNull GTFSProvider provid MTLog.w(LOG_TAG, "Cannot parse schedule '%s'!", line); continue; } - lineServiceIdWithQuotes = lineItems[GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX]; - lineServiceId = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + lineServiceId = lineItems[GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX]; + } else { + lineServiceIdWithQuotes = lineItems[GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX]; + lineServiceId = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); + } if (!serviceIds.contains(lineServiceId)) { continue; } @@ -608,8 +613,12 @@ private static HashSet findFrequencyList(@NonNull GTFSProvid MTLog.w(LOG_TAG, "Cannot parse frequency '%s'!", line); continue; } - lineServiceIdWithQuotes = lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_SERVICE_IDX]; - lineServiceId = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + lineServiceId = lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_SERVICE_IDX]; + } else { + lineServiceIdWithQuotes = lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_SERVICE_IDX]; + lineServiceId = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); + } if (!serviceIds.contains(lineServiceId)) { continue; } @@ -700,10 +709,15 @@ public static Integer findLastServiceDate(@NonNull GTFSProvider provider) { } @NonNull - private static final String[] PROJECTION_SERVICE_DATES = new String[]{ - GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID, - GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE - }; + private static final String[] PROJECTION_SERVICE_DATES = + FeatureFlags.F_EXPORT_SERVICE_ID_INTS ? new String[]{ + GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID_INT, + GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE + } + : new String[]{ + GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID, + GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE + }; @NonNull private static HashSet> findServicesAndExceptionTypes(@NonNull GTFSProvider provider, @NonNull String dateS) { @@ -717,7 +731,7 @@ private static HashSet> findServicesAndExceptionTypes(@Non if (cursor != null && cursor.getCount() > 0) { if (cursor.moveToFirst()) { do { - final String serviceId = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID); + final String serviceId = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID); // TODO final int exceptionType = CursorExtKt.optIntNN(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_EXCEPTION_TYPE, GTFSCommons.EXCEPTION_TYPE_DEFAULT); if (!TextUtils.isEmpty(serviceId)) { serviceIdAndExceptionTypes.add(new Pair<>(serviceId, exceptionType)); From ff4539cd4f4f89dec470223ec9a54fa858267f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 14 Nov 2025 22:12:40 -0500 Subject: [PATCH 3/5] wip --- .../provider/GTFSRealTimeProvider.java | 29 +++++++++++++++++++ src/main/res/values/gtfs_rts_values.xml | 1 + 2 files changed, 30 insertions(+) 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 c98c185b..dc156c0a 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -273,6 +273,20 @@ private static String getAGENCY_SERVICE_ALERTS_URL_CACHED(@NonNull Context conte return agencyServiceAlertsUrlCached; } + @Nullable + private static String serviceIdCleanupRegex = null; + + /** + * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. + */ + @NonNull + private static String getSERVICE_ID_CLEANUP_REGEX(@NonNull Context context) { + if (serviceIdCleanupRegex == null) { + serviceIdCleanupRegex = context.getResources().getString(R.string.gtfs_rts_service_id_cleanup_regex); // do not change to avoid breaking compat w/ old modules + } + return serviceIdCleanupRegex; + } + @Nullable private static String routeIdCleanupRegex = null; @@ -1164,6 +1178,21 @@ private ArrayMap parseTranslations(@NonNull GtfsRealtime.Transla return translations; } + @Nullable + private Pattern serviceIdCleanupPattern = null; + + private boolean serviceIdCleanupPatternSet = false; + + @SuppressWarnings("unused") // TODO use later for trip_updates, vehicle_location... + @Nullable + private Pattern getServiceIdCleanupPattern(@NonNull Context context) { + if (this.serviceIdCleanupPattern == null && !serviceIdCleanupPatternSet) { + this.serviceIdCleanupPattern = GTFSCommons.makeIdCleanupPattern(getSERVICE_ID_CLEANUP_REGEX(context)); + this.serviceIdCleanupPatternSet = true; + } + return this.serviceIdCleanupPattern; + } + @Nullable private Pattern routeIdCleanupPattern = null; diff --git a/src/main/res/values/gtfs_rts_values.xml b/src/main/res/values/gtfs_rts_values.xml index a853f7af..358bc53a 100644 --- a/src/main/res/values/gtfs_rts_values.xml +++ b/src/main/res/values/gtfs_rts_values.xml @@ -17,6 +17,7 @@ + From 518aa787b1fca81a8062f7f0f9b77a172b63026c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Mon, 17 Nov 2025 21:28:27 -0500 Subject: [PATCH 4/5] cleanup --- .../provider/GTFSProviderDbHelper.java | 3 + .../commons/provider/GTFSStatusProvider.java | 76 ++++++++++--------- .../provider/GTFSStatusProviderTest.kt | 32 ++++---- 3 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java index 91937ff9..d0fbd930 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java @@ -81,8 +81,11 @@ public String getLogTag() { private static final String T_DIRECTION_STOPS_SQL_INSERT = GTFSCommons.getT_DIRECTION_STOPS_SQL_INSERT(); private static final String T_DIRECTION_STOPS_SQL_DROP = GTFSCommons.getT_DIRECTION_STOPS_SQL_DROP(); + @SuppressWarnings("WeakerAccess") static final String T_SERVICE_IDS = GTFSCommons.T_SERVICE_IDS; + @SuppressWarnings("unused") // not used by main app currently static final String T_SERVICE_IDS_K_ID = GTFSCommons.T_SERVICE_IDS_K_ID; + @SuppressWarnings("unused") static final String T_SERVICE_IDS_K_ID_INT = GTFSCommons.T_SERVICE_IDS_K_ID_INT; private static final String T_SERVICE_IDS_SQL_CREATE = GTFSCommons.getT_SERVICE_IDS_SQL_CREATE(); private static final String T_SERVICE_IDS_SQL_INSERT = GTFSCommons.getT_SERVICE_IDS_SQL_INSERT(); diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java index faaf1a54..2c2541c5 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java @@ -357,8 +357,8 @@ static HashSet findScheduleList(@NonNull GTFSProvider provid long diffWithRealityInMs) { final int timeI = Integer.parseInt(timeS); HashSet result = new HashSet<>(); - final Set> serviceIdAndExceptionTypes = findServicesAndExceptionTypes(provider, dateS); - final Set serviceIds = filterServiceIds(serviceIdAndExceptionTypes, diffWithRealityInMs > 0L); + final Set> serviceIdOrIntAndExceptionTypes = findServicesAndExceptionTypes(provider, dateS); + final Set serviceIdOrInts = filterServiceIdOrInts(serviceIdOrIntAndExceptionTypes, diffWithRealityInMs > 0L); BufferedReader br = null; String line = null; final Context context = provider.requireContextCompat(); @@ -374,7 +374,7 @@ static HashSet findScheduleList(@NonNull GTFSProvider provid br = new BufferedReader(new InputStreamReader(is, FileUtils.getUTF8()), 8192); String[] lineItems; String lineServiceIdWithQuotes; - String lineServiceId; + String lineServiceIdOrInt; long lineDirectionId; int lineDeparture; int lineDepartureDelta; @@ -393,12 +393,12 @@ static HashSet findScheduleList(@NonNull GTFSProvider provid continue; } if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { - lineServiceId = lineItems[GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX]; + lineServiceIdOrInt = lineItems[GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX]; } else { lineServiceIdWithQuotes = lineItems[GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX]; - lineServiceId = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); + lineServiceIdOrInt = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); } - if (!serviceIds.contains(lineServiceId)) { + if (!serviceIdOrInts.contains(lineServiceIdOrInt)) { continue; } lineDirectionId = Long.parseLong(lineItems[GTFS_SCHEDULE_STOP_FILE_COL_DIRECTION_IDX]); @@ -465,44 +465,44 @@ static HashSet findScheduleList(@NonNull GTFSProvider provid } @NonNull - protected static Set filterServiceIds(@NonNull Set> serviceIdAndExceptionTypes, boolean usingAnotherDate) { - final HashSet serviceIds = new HashSet<>(); - final HashSet serviceIdsToRemove = new HashSet<>(); - final HashSet serviceIdsToAdd = new HashSet<>(); - for (Pair serviceIdAndExceptionType : serviceIdAndExceptionTypes) { - final String serviceId = serviceIdAndExceptionType.first; - final Integer exceptionType = serviceIdAndExceptionType.second; + protected static Set filterServiceIdOrInts(@NonNull Set> serviceIdOrIntAndExceptionTypes, boolean usingAnotherDate) { + final HashSet serviceIdOrInts = new HashSet<>(); + final HashSet serviceIdOrIntsToRemove = new HashSet<>(); + final HashSet serviceIdOrIntsToAdd = new HashSet<>(); + for (Pair serviceIdOrIntAndExceptionType : serviceIdOrIntAndExceptionTypes) { + final String serviceIdOntInt = serviceIdOrIntAndExceptionType.first; + final Integer exceptionType = serviceIdOrIntAndExceptionType.second; if (exceptionType == null) { - MTLog.w(LOG_TAG, "Skip invalid exception type fr service ID '%s'!", serviceId); + MTLog.w(LOG_TAG, "Skip invalid exception type fr service ID '%s'!", serviceIdOntInt); continue; } switch (exceptionType) { case GTFSCommons.EXCEPTION_TYPE_DEFAULT: - serviceIds.add(serviceId); + serviceIdOrInts.add(serviceIdOntInt); break; case GTFSCommons.EXCEPTION_TYPE_ADDED: if (usingAnotherDate) { - serviceIdsToAdd.add(serviceId); // maybe all services add ADDED (no calendar.txt provided) + serviceIdOrIntsToAdd.add(serviceIdOntInt); // maybe all services add ADDED (no calendar.txt provided) } else { - serviceIds.add(serviceId); + serviceIdOrInts.add(serviceIdOntInt); } break; case GTFSCommons.EXCEPTION_TYPE_REMOVED: - serviceIdsToRemove.add(serviceId); + serviceIdOrIntsToRemove.add(serviceIdOntInt); break; default: - MTLog.w(LOG_TAG, "Unexpected service ID exception type '%s' for '%s'!", exceptionType, serviceId); + MTLog.w(LOG_TAG, "Unexpected service ID exception type '%s' for '%s'!", exceptionType, serviceIdOntInt); break; } } if (usingAnotherDate) { - if (serviceIds.isEmpty()) { - serviceIds.addAll(serviceIdsToAdd); // maybe all services add ADDED (no calendar.txt provided) + if (serviceIdOrInts.isEmpty()) { + serviceIdOrInts.addAll(serviceIdOrIntsToAdd); // maybe all services add ADDED (no calendar.txt provided) } } else { - serviceIds.removeAll(serviceIdsToRemove); + serviceIdOrInts.removeAll(serviceIdOrIntsToRemove); } - return serviceIds; + return serviceIdOrInts; } @NonNull @@ -582,8 +582,8 @@ private static HashSet findFrequencyList(@NonNull GTFSProvid long diffWithRealityInMs) { long timeI = Integer.parseInt(timeS); final HashSet result = new HashSet<>(); - final Set> serviceIdAndExceptionTypes = findServicesAndExceptionTypes(provider, dateS); - final Set serviceIds = filterServiceIds(serviceIdAndExceptionTypes, diffWithRealityInMs > 0L); + final Set> serviceIdOrIntAndExceptionTypes = findServicesAndExceptionTypes(provider, dateS); + final Set serviceIdOrInts = filterServiceIdOrInts(serviceIdOrIntAndExceptionTypes, diffWithRealityInMs > 0L); BufferedReader br = null; String line = null; final Context context = provider.requireContextCompat(); @@ -591,7 +591,7 @@ private static HashSet findFrequencyList(@NonNull GTFSProvid InputStream is; String[] lineItems; String lineServiceIdWithQuotes; - String lineServiceId; + String lineServiceIdOrInt; long lineDirectionId; int endTime; int startTime; @@ -614,12 +614,12 @@ private static HashSet findFrequencyList(@NonNull GTFSProvid continue; } if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { - lineServiceId = lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_SERVICE_IDX]; + lineServiceIdOrInt = lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_SERVICE_IDX]; } else { lineServiceIdWithQuotes = lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_SERVICE_IDX]; - lineServiceId = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); + lineServiceIdOrInt = lineServiceIdWithQuotes.substring(1, lineServiceIdWithQuotes.length() - 1); } - if (!serviceIds.contains(lineServiceId)) { + if (!serviceIdOrInts.contains(lineServiceIdOrInt)) { continue; } lineDirectionId = Long.parseLong(lineItems[GTFS_ROUTE_FREQUENCY_FILE_COL_DIRECTION_IDX]); @@ -713,15 +713,14 @@ public static Integer findLastServiceDate(@NonNull GTFSProvider provider) { FeatureFlags.F_EXPORT_SERVICE_ID_INTS ? new String[]{ GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID_INT, GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE - } - : new String[]{ + } : new String[]{ GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID, GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE }; @NonNull private static HashSet> findServicesAndExceptionTypes(@NonNull GTFSProvider provider, @NonNull String dateS) { - final HashSet> serviceIdAndExceptionTypes = new HashSet<>(); + final HashSet> serviceIdOrIntAndExceptionTypes = new HashSet<>(); Cursor cursor = null; try { final String selection = SqlUtils.getWhereEquals(GTFSProviderDbHelper.T_SERVICE_DATES_K_DATE, dateS); @@ -731,10 +730,15 @@ private static HashSet> findServicesAndExceptionTypes(@Non if (cursor != null && cursor.getCount() > 0) { if (cursor.moveToFirst()) { do { - final String serviceId = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID); // TODO + final String serviceIdOrInt; + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + serviceIdOrInt = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID_INT); + } else { + serviceIdOrInt = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID); + } final int exceptionType = CursorExtKt.optIntNN(cursor, GTFSProviderDbHelper.T_SERVICE_DATES_K_EXCEPTION_TYPE, GTFSCommons.EXCEPTION_TYPE_DEFAULT); - if (!TextUtils.isEmpty(serviceId)) { - serviceIdAndExceptionTypes.add(new Pair<>(serviceId, exceptionType)); + if (!TextUtils.isEmpty(serviceIdOrInt)) { + serviceIdOrIntAndExceptionTypes.add(new Pair<>(serviceIdOrInt, exceptionType)); } } while (cursor.moveToNext()); } @@ -744,7 +748,7 @@ private static HashSet> findServicesAndExceptionTypes(@Non } finally { SqlUtils.closeQuietly(cursor); } - return serviceIdAndExceptionTypes; + return serviceIdOrIntAndExceptionTypes; } public static void cacheStatusS(@NonNull GTFSProvider provider, @NonNull POIStatus newStatusToCache) { diff --git a/src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt b/src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt index fe9055a6..9e550363 100644 --- a/src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt +++ b/src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt @@ -9,59 +9,59 @@ import androidx.core.util.Pair as androidXPair class GTFSStatusProviderTest { @Test - fun test_filterServiceIds_simple() { + fun test_filterServiceIdOrInts_simple() { val serviceIdAndExceptionTypes: Set> = setOf( androidXPair("TRAIN-A23-Blocks-Semaine-09", GTFSCommons.EXCEPTION_TYPE_DEFAULT), // 20231221 // from calendar.txt ) val usingAnotherDate = false - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Semaine-09")) } @Test - fun test_filterServiceIds_simple_usingAnotherDay() { + fun test_filterServiceIdOrInts_simple_usingAnotherDay() { val serviceIdAndExceptionTypes: Set> = setOf( androidXPair("TRAIN-A23-Blocks-Semaine-09", GTFSCommons.EXCEPTION_TYPE_DEFAULT), // 20231221 // from calendar.txt ) val usingAnotherDate = true - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Semaine-09")) } @Test - fun test_filterServiceIds_noCalendarTxt() { + fun test_filterServiceIdOrInts_noCalendarTxt() { val serviceIdAndExceptionTypes: Set> = setOf( androidXPair("TRAIN-A23-Blocks-Semaine-09", GTFSCommons.EXCEPTION_TYPE_ADDED), // 20231221 // from calendar_dates.txt ) val usingAnotherDate = false - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Semaine-09")) } @Test - fun test_filterServiceIds_noCalendarTxt_usingAnotherDay() { + fun test_filterServiceIdOrInts_noCalendarTxt_usingAnotherDay() { val serviceIdAndExceptionTypes: Set> = setOf( androidXPair("TRAIN-A23-Blocks-Semaine-09", GTFSCommons.EXCEPTION_TYPE_ADDED), // 20231221 // from calendar_dates.txt ) val usingAnotherDate = true - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Semaine-09")) } @Test - fun test_filterServiceIds_exceptionDate() { + fun test_filterServiceIdOrInts_exceptionDate() { val serviceIdAndExceptionTypes: Set> = setOf( androidXPair("TRAIN-A23-Blocks-Dimanche-03", GTFSCommons.EXCEPTION_TYPE_DEFAULT), // 20231224 // from calendar.txt androidXPair("TRAIN-A23-Blocks-Dimanche-03", GTFSCommons.EXCEPTION_TYPE_REMOVED), // 20231224 // from calendar_dates.txt @@ -69,14 +69,14 @@ class GTFSStatusProviderTest { ) val usingAnotherDate = false - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-FĂȘte-1-03")) } @Test - fun test_filterServiceIds_exceptionDate_usingAnotherDay() { + fun test_filterServiceIdOrInts_exceptionDate_usingAnotherDay() { val serviceIdAndExceptionTypes: Set> = setOf( androidXPair("TRAIN-A23-Blocks-Dimanche-03", GTFSCommons.EXCEPTION_TYPE_DEFAULT), // 20231224 // from calendar.txt androidXPair("TRAIN-A23-Blocks-Dimanche-03", GTFSCommons.EXCEPTION_TYPE_REMOVED), // 20231224 // from calendar_dates.txt @@ -84,7 +84,7 @@ class GTFSStatusProviderTest { ) val usingAnotherDate = true - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Dimanche-03")) @@ -98,7 +98,7 @@ class GTFSStatusProviderTest { ) val usingAnotherDate = false - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(2, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-FĂȘte-1-03")) @@ -113,7 +113,7 @@ class GTFSStatusProviderTest { ) val usingAnotherDate = true - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Dimanche-03")) @@ -127,7 +127,7 @@ class GTFSStatusProviderTest { ) val usingAnotherDate = false - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(0, result.size) } @@ -140,7 +140,7 @@ class GTFSStatusProviderTest { ) val usingAnotherDate = true - val result = GTFSStatusProvider.filterServiceIds(serviceIdAndExceptionTypes, usingAnotherDate) + val result = GTFSStatusProvider.filterServiceIdOrInts(serviceIdAndExceptionTypes, usingAnotherDate) assertEquals(1, result.size) assertTrue(result.contains("TRAIN-A23-Blocks-Dimanche-03")) From 7d6db2c648da0dde9f24f2f27a5e07c6b83f877a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Tue, 18 Nov 2025 20:00:55 -0500 Subject: [PATCH 5/5] PR review --- .../commons/provider/GTFSStatusProvider.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java index 2c2541c5..6b7b064e 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java @@ -470,28 +470,28 @@ protected static Set filterServiceIdOrInts(@NonNull Set serviceIdOrIntsToRemove = new HashSet<>(); final HashSet serviceIdOrIntsToAdd = new HashSet<>(); for (Pair serviceIdOrIntAndExceptionType : serviceIdOrIntAndExceptionTypes) { - final String serviceIdOntInt = serviceIdOrIntAndExceptionType.first; + final String serviceIdOrInt = serviceIdOrIntAndExceptionType.first; final Integer exceptionType = serviceIdOrIntAndExceptionType.second; if (exceptionType == null) { - MTLog.w(LOG_TAG, "Skip invalid exception type fr service ID '%s'!", serviceIdOntInt); + MTLog.w(LOG_TAG, "SKIP invalid exception type for service ID '%s'!", serviceIdOrInt); continue; } switch (exceptionType) { case GTFSCommons.EXCEPTION_TYPE_DEFAULT: - serviceIdOrInts.add(serviceIdOntInt); + serviceIdOrInts.add(serviceIdOrInt); break; case GTFSCommons.EXCEPTION_TYPE_ADDED: if (usingAnotherDate) { - serviceIdOrIntsToAdd.add(serviceIdOntInt); // maybe all services add ADDED (no calendar.txt provided) + serviceIdOrIntsToAdd.add(serviceIdOrInt); // maybe all services add ADDED (no calendar.txt provided) } else { - serviceIdOrInts.add(serviceIdOntInt); + serviceIdOrInts.add(serviceIdOrInt); } break; case GTFSCommons.EXCEPTION_TYPE_REMOVED: - serviceIdOrIntsToRemove.add(serviceIdOntInt); + serviceIdOrIntsToRemove.add(serviceIdOrInt); break; default: - MTLog.w(LOG_TAG, "Unexpected service ID exception type '%s' for '%s'!", exceptionType, serviceIdOntInt); + MTLog.w(LOG_TAG, "Unexpected service ID exception type '%s' for '%s'!", exceptionType, serviceIdOrInt); break; } }