From 25b13cb4bf0a48390eaa7da9e34e543bd4088e02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Sun, 2 Nov 2025 19:45:24 -0500 Subject: [PATCH 1/2] Service updates for Routes > include all directions --- .../org/mtransit/android/commons/SqlUtils.java | 14 ++++++++++++-- .../commons/provider/GTFSRDSProvider.java | 8 ++++---- .../commons/provider/POIProviderContract.java | 4 ++-- .../commons/provider/ServiceUpdateProvider.java | 11 +++++++++++ .../provider/ServiceUpdateProviderContract.java | 11 ++++++++++- .../commons/provider/StmInfoApiProvider.java | 16 +++++++++++++++- 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/SqlUtils.java b/src/main/java/org/mtransit/android/commons/SqlUtils.java index d97049d9..6be41108 100644 --- a/src/main/java/org/mtransit/android/commons/SqlUtils.java +++ b/src/main/java/org/mtransit/android/commons/SqlUtils.java @@ -78,8 +78,18 @@ public static void appendProjection(@NonNull SimpleArrayMap proj } @NonNull - public static String getLike(@NonNull String tableColumn, @NonNull String value) { - return SQLUtils.getLike(tableColumn, value); + public static String getLikeContains(@NonNull String tableColumn, @NonNull String value) { + return SQLUtils.getLikeContains(tableColumn, value); + } + + @NonNull + public static String getLikeStartsWith(@NonNull String tableColumn, @NonNull String value) { + return SQLUtils.getLikeStartsWith(tableColumn, value); + } + + @NonNull + public static String getLikeEndsWithCharCount(@NonNull String tableColumn, @NonNull String value, @NonNull Integer charCount) { + return SQLUtils.getLikeEndsWithCharCount(tableColumn, value, charCount); } @NonNull diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java index 4669ad2a..0d9835be 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java @@ -271,10 +271,10 @@ private static void appendRouteDirectionStopSearch(Uri uri, SQLiteQueryBuilder q } inWhere.append(SqlUtils.getWhereGroup( // SqlUtils.OR, // - SqlUtils.getLike(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_CODE), keyword), - SqlUtils.getLike(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_ROUTE, GTFSProviderDbHelper.T_ROUTE_K_SHORT_NAME), keyword), - SqlUtils.getLike(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_ROUTE, GTFSProviderDbHelper.T_ROUTE_K_LONG_NAME), keyword), - SqlUtils.getLike(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_NAME), keyword))); + SqlUtils.getLikeContains(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_CODE), keyword), + SqlUtils.getLikeContains(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_ROUTE, GTFSProviderDbHelper.T_ROUTE_K_SHORT_NAME), keyword), + SqlUtils.getLikeContains(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_ROUTE, GTFSProviderDbHelper.T_ROUTE_K_LONG_NAME), keyword), + SqlUtils.getLikeContains(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_NAME), keyword))); } qb.appendWhere(inWhere); } diff --git a/src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java index c5438684..2ae9f32a 100644 --- a/src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java @@ -449,7 +449,7 @@ private static int getSearchSelectionLikeColumns(@Nullable String[] searchableLi if (c > 0) { selectionSb.append(SqlUtils.OR); } - selectionSb.append(SqlUtils.getLike(searchableColumn, keyword)); + selectionSb.append(SqlUtils.getLikeContains(searchableColumn, keyword)); c++; } } @@ -513,7 +513,7 @@ private static int getSearchSelectionScoreLikeColumns(String[] searchableLikeCol if (c > 0) { selectionSb.append(PLUS); } - selectionSb.append(SqlUtils.P1).append(SqlUtils.getLike(searchableColumn, keyword)).append(SqlUtils.P2); + selectionSb.append(SqlUtils.P1).append(SqlUtils.getLikeContains(searchableColumn, keyword)).append(SqlUtils.P2); c++; } } diff --git a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java b/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java index c5770c27..d92d9785 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java @@ -217,6 +217,17 @@ public static ArrayList getCachedServiceUpdatesS(@NonNull Service ); } + @Nullable + public static ArrayList getCachedServiceUpdatesStartsWithS(@NonNull ServiceUpdateProviderContract provider, @NonNull String targetUUID, @NonNull Integer charCount) { + return getCachedServiceUpdatesS( + provider, + getServiceUpdateContentUri(provider), + SqlUtils.getLikeEndsWithCharCount(Columns.T_SERVICE_UPDATE_K_TARGET_UUID, targetUUID, charCount) + + SqlUtils.AND + + SqlUtils.getWhereEqualsString(Columns.T_SERVICE_UPDATE_K_LANGUAGE, provider.getServiceUpdateLanguage()) + ); + } + @Nullable private static ArrayList getCachedServiceUpdatesS(@NonNull ServiceUpdateProviderContract provider, Uri uri, String selection) { ArrayList cache = new ArrayList<>(); diff --git a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java index 078e49ee..f2e58c6d 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java @@ -101,6 +101,7 @@ public String getLogTag() { private final String authority; @Nullable private final Route route; + private final boolean includeAllDirections; @Nullable private final RouteDirection routeDirection; @@ -114,15 +115,22 @@ public String getLogTag() { private Map providedEncryptKeysMap = null; public Filter(@NonNull POI poi) { - this.poi = poi; this.authority = poi.getAuthority(); + this.poi = poi; this.route = null; + this.includeAllDirections = false; this.routeDirection = null; } + @Deprecated public Filter(@NonNull String authority, @NonNull Route route) { + this(authority, route, false); + } + + public Filter(@NonNull String authority, @NonNull Route route, boolean includeAllDirections) { this.authority = authority; this.route = route; + this.includeAllDirections = includeAllDirections; this.routeDirection = null; this.poi = null; } @@ -131,6 +139,7 @@ public Filter(@NonNull String authority, @NonNull RouteDirection routeDirection) this.authority = authority; this.routeDirection = routeDirection; this.route = null; + this.includeAllDirections = false; this.poi = null; } 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 fe095381..03f1c01a 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java @@ -254,7 +254,7 @@ public ArrayList getCachedServiceUpdates(@NonNull ServiceUpdatePr } else if (serviceUpdateFilter.getRouteDirection() != null) { return getCachedServiceUpdates(context, serviceUpdateFilter.getRouteDirection()); } else if ((serviceUpdateFilter.getRoute() != null)) { // NOT SUPPORTED - return makeServiceUpdateNoneList(this, serviceUpdateFilter.getRoute().getUUID(), SERVICE_UPDATE_SOURCE_ID); + return getCachedServiceUpdates(context, serviceUpdateFilter.getRoute()); } else { MTLog.w(this, "getCachedServiceUpdates() > no service update (poi null or not RDS or no route)"); return null; @@ -300,6 +300,20 @@ private ArrayList getCachedServiceUpdates(@NonNull Context contex return cachedServiceUpdates; } + @NonNull + private ArrayList getCachedServiceUpdates(@NonNull Context context, @NonNull Route route) { + final ArrayList cachedServiceUpdates = new ArrayList<>(); + final String routeWithoutDirectionUUIDs = getRouteDirectionServiceUpdateTargetUUID(getAgencyTag(context), route.getShortName(), StringUtils.EMPTY); + final ArrayList routeCachedServiceUpdatesS = ServiceUpdateProvider.getCachedServiceUpdatesStartsWithS(this, routeWithoutDirectionUUIDs, 1); + if (routeCachedServiceUpdatesS != null) { + cachedServiceUpdates.addAll(routeCachedServiceUpdatesS); + } + for (ServiceUpdate serviceUpdate : cachedServiceUpdates) { + serviceUpdate.setTargetUUID(route.getUUID()); + } + return cachedServiceUpdates; + } + private void enhanceRDServiceUpdatesForStop(@NonNull Context context, ArrayList serviceUpdates, Map targetUUIDs, // different UUID from provider target UUID From 0e885500c40ce08a5d97bfcd226d819c9a763b89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Sun, 2 Nov 2025 20:08:46 -0500 Subject: [PATCH 2/2] wip --- .../commons/provider/StmInfoApiProvider.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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 03f1c01a..dc3777d2 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java @@ -577,7 +577,7 @@ public ArrayList getNewServiceUpdates(@NonNull ServiceUpdateProvi } else if (serviceUpdateFilter.getRouteDirection() != null) { return getNewServiceUpdates(context, serviceUpdateFilter.getRouteDirection()); } else if ((serviceUpdateFilter.getRoute() != null)) { // NOT SUPPORTED - return makeServiceUpdateNoneList(this, serviceUpdateFilter.getRoute().getUUID(), SERVICE_UPDATE_SOURCE_ID); + return getNewServiceUpdates(context, serviceUpdateFilter.getRoute()); } else { MTLog.w(this, "getNewServiceUpdates() > no service update (poi null or not RDS or no route)"); return null; @@ -596,6 +596,18 @@ private ArrayList getNewServiceUpdates(@NonNull Context context, return getCachedServiceUpdates(context, rds); } + @SuppressWarnings("SameReturnValue") + @Nullable + private ArrayList getNewServiceUpdates(@SuppressWarnings("unused") @NonNull Context context, @NonNull Route route) { + if (route.getShortName().isEmpty()) { + MTLog.d(this, "getNewServiceUpdates() > skip (stop w/o code OR route w/o short name: %s)", route); + return null; + } + // USING same feed as real-time POI status schedule + // -> can't load status without stop code + return null; + } + @SuppressWarnings("SameReturnValue") @Nullable private ArrayList getNewServiceUpdates(@SuppressWarnings("unused") @NonNull Context context, @NonNull RouteDirection rd) {