From d3434a65cc9f95c810f9352e7acc74b57c9e9f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Tue, 9 Jun 2026 12:17:03 -0400 Subject: [PATCH 1/3] GTFS-RT provider > handle interrupted I/O exception Avoid continuously trying to reconnect after I/O exception --- .../commons/provider/GTFSRealTimeProvider.java | 16 ++++++++++++++++ 1 file changed, 16 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 f0e5f6b8..93877b42 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -64,6 +64,8 @@ import org.mtransit.commons.GTFSCommons; import org.mtransit.commons.SourceUtils; +import java.io.IOException; +import java.io.InterruptedIOException; import java.net.HttpURLConnection; import java.net.SocketException; import java.net.UnknownHostException; @@ -975,7 +977,14 @@ private List loadAgencyServiceUpdateDataFromWWW(@NonNull Context setServiceUpdateLastUpdateCode(567); // SSL certificate not trusted (on this device) getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); return null; + } catch (InterruptedIOException iioe) { + MTLog.w(this, iioe, "Connection timeout!"); + setServiceUpdateLastUpdateCode(567); + getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); + return null; } catch (UnknownHostException uhe) { + setServiceUpdateLastUpdateCode(567); + getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); if (MTLog.isLoggable(android.util.Log.DEBUG)) { MTLog.w(this, uhe, "No Internet Connection!"); } else { @@ -983,8 +992,15 @@ private List loadAgencyServiceUpdateDataFromWWW(@NonNull Context } return null; } catch (SocketException se) { + setServiceUpdateLastUpdateCode(567); + getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); MTLog.w(LOG_TAG, se, "No Internet Connection!"); return null; + } catch (IOException ioe) { + setServiceUpdateLastUpdateCode(567); + getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); + MTLog.w(this, ioe, "I/O error!"); + return null; } catch (Exception e) { // Unknown error MTLog.e(LOG_TAG, e, "INTERNAL ERROR: Unknown Exception"); return null; From fdd7c7026a11945b49875174dddad53d0c3c0471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Tue, 9 Jun 2026 14:16:45 -0400 Subject: [PATCH 2/3] wip --- .../provider/GTFSRealTimeProvider.java | 8 ++++---- .../info/stm/StmInfoServiceUpdateProvider.kt | 3 +-- .../status/GTFSRealTimeTripUpdatesProvider.kt | 20 ++++++++++++++++--- .../GTFSRealTimeVehiclePositionsProvider.kt | 16 +++++++++++++++ 4 files changed, 38 insertions(+), 9 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 93877b42..c5ebcc3b 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -983,23 +983,23 @@ private List loadAgencyServiceUpdateDataFromWWW(@NonNull Context getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); return null; } catch (UnknownHostException uhe) { - setServiceUpdateLastUpdateCode(567); - getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); if (MTLog.isLoggable(android.util.Log.DEBUG)) { MTLog.w(this, uhe, "No Internet Connection!"); } else { MTLog.w(this, "No Internet Connection!"); } + setServiceUpdateLastUpdateCode(567); + getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); return null; } catch (SocketException se) { + MTLog.w(LOG_TAG, se, "No Internet Connection!"); setServiceUpdateLastUpdateCode(567); getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); - MTLog.w(LOG_TAG, se, "No Internet Connection!"); return null; } catch (IOException ioe) { + MTLog.w(this, ioe, "I/O error!"); setServiceUpdateLastUpdateCode(567); getStorage(context).saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()); - MTLog.w(this, ioe, "I/O error!"); return null; } catch (Exception e) { // Unknown error MTLog.e(LOG_TAG, e, "INTERNAL ERROR: Unknown Exception"); diff --git a/src/main/java/org/mtransit/android/commons/provider/ca/info/stm/StmInfoServiceUpdateProvider.kt b/src/main/java/org/mtransit/android/commons/provider/ca/info/stm/StmInfoServiceUpdateProvider.kt index c852b4b7..a8aa3f22 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ca/info/stm/StmInfoServiceUpdateProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/ca/info/stm/StmInfoServiceUpdateProvider.kt @@ -1,7 +1,6 @@ package org.mtransit.android.commons.provider.ca.info.stm import android.content.Context -import android.util.Log import androidx.annotation.VisibleForTesting import org.mtransit.android.commons.Constants import org.mtransit.android.commons.HtmlUtils @@ -231,7 +230,7 @@ object StmInfoServiceUpdateProvider : MTLog.Loggable { getStorage(context).saveServiceUpdateLastUpdate(TimeUtilsK.currentInstant()) return null } catch (uhe: UnknownHostException) { - if (MTLog.isLoggable(Log.DEBUG)) { + if (MTLog.isLoggable(android.util.Log.DEBUG)) { MTLog.w(this@StmInfoServiceUpdateProvider, uhe, "No Internet Connection!") } else { MTLog.w(this@StmInfoServiceUpdateProvider, "No Internet Connection!") diff --git a/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt b/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt index 5e822fb5..c1b554be 100644 --- a/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt @@ -2,7 +2,6 @@ package org.mtransit.android.commons.provider.status import android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND import android.content.Context -import android.util.Log import com.google.transit.realtime.headerOrNull import org.mtransit.android.commons.Constants import org.mtransit.android.commons.MTLog @@ -37,6 +36,7 @@ import org.mtransit.android.commons.provider.gtfs.storage import org.mtransit.commons.SourceUtils import java.io.File import java.io.IOException +import java.io.InterruptedIOException import java.net.HttpURLConnection import java.net.SocketException import java.net.UnknownHostException @@ -46,8 +46,8 @@ import kotlin.time.Duration.Companion.hours import kotlin.time.Duration.Companion.minutes import kotlin.time.Duration.Companion.seconds import com.google.transit.realtime.GtfsRealtime.FeedMessage as GFeedMessage -import com.google.transit.realtime.GtfsRealtime.TripUpdate as GTripUpdate import com.google.transit.realtime.GtfsRealtime.TripDescriptor.ScheduleRelationship as GTDScheduleRelationship +import com.google.transit.realtime.GtfsRealtime.TripUpdate as GTripUpdate object GTFSRealTimeTripUpdatesProvider : MTLog.Loggable { @@ -453,15 +453,29 @@ object GTFSRealTimeTripUpdatesProvider : MTLog.Loggable { storage.saveTripUpdateLastUpdateCode(567) // SSL certificate not trusted (on this device) storage.saveTripUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false + } catch (iioe: InterruptedIOException) { + MTLog.w(LOG_TAG, iioe, "Connection timeout!") + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + return false } catch (uhe: UnknownHostException) { - if (MTLog.isLoggable(Log.DEBUG)) { + if (MTLog.isLoggable(android.util.Log.DEBUG)) { MTLog.w(LOG_TAG, uhe, "No Internet Connection!") } else { MTLog.w(LOG_TAG, "No Internet Connection!") } + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false } catch (se: SocketException) { MTLog.w(LOG_TAG, se, "No Internet Connection!") + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + return false + } catch (ioe: IOException) { + MTLog.w(LOG_TAG, ioe, "I/O error!") + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false } catch (e: Exception) { // Unknown error MTLog.e(LOG_TAG, e, "INTERNAL ERROR: Unknown Exception") 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 a27cc9ca..dbdbf5b0 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 @@ -36,6 +36,8 @@ import org.mtransit.android.commons.provider.gtfs.storage 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.io.IOException +import java.io.InterruptedIOException import java.net.HttpURLConnection import java.net.SocketException import java.net.UnknownHostException @@ -248,15 +250,29 @@ object GTFSRealTimeVehiclePositionsProvider : MTLog.Loggable { storage.saveVehicleLocationLastUpdateCode(567) // SSL certificate not trusted (on this device) storage.saveVehicleLocationLastUpdateMs(TimeUtils.currentTimeMillis()) return null + } catch (iioe: InterruptedIOException) { + MTLog.w(LOG_TAG, iioe, "Connection timeout!") + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + return null } catch (uhe: UnknownHostException) { if (MTLog.isLoggable(android.util.Log.DEBUG)) { MTLog.w(LOG_TAG, uhe, "No Internet Connection!") } else { MTLog.w(LOG_TAG, "No Internet Connection!") } + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return null } catch (se: SocketException) { MTLog.w(LOG_TAG, se, "No Internet Connection!") + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + return null + } catch (ioe: IOException) { + MTLog.w(LOG_TAG, ioe, "I/O error!") + storage.saveTripUpdateLastUpdateCode(567) + storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return null } catch (e: Exception) { // Unknown error MTLog.e(LOG_TAG, e, "INTERNAL ERROR: Unknown Exception") From 9841a8a02a12529dc9974f464fda378a825fc924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Tue, 9 Jun 2026 14:25:31 -0400 Subject: [PATCH 3/3] PR comments --- .../commons/provider/GTFSRealTimeProvider.java | 2 ++ .../commons/provider/gtfs/GtfsRealTimeStorage.kt | 14 ++++++++++---- .../status/GTFSRealTimeTripUpdatesProvider.kt | 8 ++++---- .../GTFSRealTimeVehiclePositionsProvider.kt | 16 ++++++++-------- 4 files changed, 24 insertions(+), 16 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 c5ebcc3b..33bbb5bb 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -1727,6 +1727,8 @@ private void initAllDbTables(@NonNull SQLiteDatabase db) { db.execSQL(T_GTFS_REAL_TIME_VEHICLE_LOCATION_SQL_CREATE); db.execSQL(T_GTFS_REAL_TIME_SERVICE_UPDATE_SQL_CREATE); storage.saveServiceUpdateLastUpdateMs(null); + storage.saveTripUpdateLastUpdateMs(null); + storage.saveVehicleLocationLastUpdateMs(null); } } } diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealTimeStorage.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealTimeStorage.kt index 7960cedb..4039c997 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealTimeStorage.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealTimeStorage.kt @@ -35,8 +35,11 @@ class GtfsRealTimeStorage( prefLcl.getLong(PREF_KEY_TRIP_UPDATE_LAST_UPDATE_MS, default) @WorkerThread - fun saveTripUpdateLastUpdateMs(lastUpdateInMs: Long) { - prefLcl.edit { putLong(PREF_KEY_TRIP_UPDATE_LAST_UPDATE_MS, lastUpdateInMs) } + fun saveTripUpdateLastUpdateMs(lastUpdateInMs: Long?) { + prefLcl.edit { + lastUpdateInMs?.let { putLong(PREF_KEY_TRIP_UPDATE_LAST_UPDATE_MS, it) } + ?: remove(PREF_KEY_TRIP_UPDATE_LAST_UPDATE_MS) + } } @WorkerThread @@ -77,8 +80,11 @@ class GtfsRealTimeStorage( prefLcl.getLong(PREF_KEY_VEHICLE_LOCATION_LAST_UPDATE_MS, default) @WorkerThread - fun saveVehicleLocationLastUpdateMs(lastUpdateInMs: Long) { - prefLcl.edit { putLong(PREF_KEY_VEHICLE_LOCATION_LAST_UPDATE_MS, lastUpdateInMs) } + fun saveVehicleLocationLastUpdateMs(lastUpdateInMs: Long?) { + prefLcl.edit { + lastUpdateInMs?.let { putLong(PREF_KEY_VEHICLE_LOCATION_LAST_UPDATE_MS, it) } + ?: remove(PREF_KEY_VEHICLE_LOCATION_LAST_UPDATE_MS) + } } @WorkerThread diff --git a/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt b/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt index c1b554be..bb2b2075 100644 --- a/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/status/GTFSRealTimeTripUpdatesProvider.kt @@ -456,7 +456,7 @@ object GTFSRealTimeTripUpdatesProvider : MTLog.Loggable { } catch (iioe: InterruptedIOException) { MTLog.w(LOG_TAG, iioe, "Connection timeout!") storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveTripUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false } catch (uhe: UnknownHostException) { if (MTLog.isLoggable(android.util.Log.DEBUG)) { @@ -465,17 +465,17 @@ object GTFSRealTimeTripUpdatesProvider : MTLog.Loggable { MTLog.w(LOG_TAG, "No Internet Connection!") } storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveTripUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false } catch (se: SocketException) { MTLog.w(LOG_TAG, se, "No Internet Connection!") storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveTripUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false } catch (ioe: IOException) { MTLog.w(LOG_TAG, ioe, "I/O error!") storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveTripUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) return false } catch (e: Exception) { // Unknown error MTLog.e(LOG_TAG, e, "INTERNAL ERROR: Unknown Exception") 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 dbdbf5b0..97cfe75e 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 @@ -252,8 +252,8 @@ object GTFSRealTimeVehiclePositionsProvider : MTLog.Loggable { return null } catch (iioe: InterruptedIOException) { MTLog.w(LOG_TAG, iioe, "Connection timeout!") - storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveVehicleLocationLastUpdateCode(567) + storage.saveVehicleLocationLastUpdateMs(TimeUtils.currentTimeMillis()) return null } catch (uhe: UnknownHostException) { if (MTLog.isLoggable(android.util.Log.DEBUG)) { @@ -261,18 +261,18 @@ object GTFSRealTimeVehiclePositionsProvider : MTLog.Loggable { } else { MTLog.w(LOG_TAG, "No Internet Connection!") } - storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveVehicleLocationLastUpdateCode(567) + storage.saveVehicleLocationLastUpdateMs(TimeUtils.currentTimeMillis()) return null } catch (se: SocketException) { MTLog.w(LOG_TAG, se, "No Internet Connection!") - storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveVehicleLocationLastUpdateCode(567) + storage.saveVehicleLocationLastUpdateMs(TimeUtils.currentTimeMillis()) return null } catch (ioe: IOException) { MTLog.w(LOG_TAG, ioe, "I/O error!") - storage.saveTripUpdateLastUpdateCode(567) - storage.saveServiceUpdateLastUpdateMs(TimeUtils.currentTimeMillis()) + storage.saveVehicleLocationLastUpdateCode(567) + storage.saveVehicleLocationLastUpdateMs(TimeUtils.currentTimeMillis()) return null } catch (e: Exception) { // Unknown error MTLog.e(LOG_TAG, e, "INTERNAL ERROR: Unknown Exception")