From ca3516fad1f47bcef897f8631699c66f38e6c204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Thu, 15 Jan 2026 11:36:38 -0500 Subject: [PATCH 1/4] Pre-vehicle cleanup --- pub/generate_all_dpis_from_xxxhdpi.sh | 48 +++++ src/debug/res/values/constants.xml | 1 + .../android/commons/AppUpdateLauncher.kt | 4 +- .../android/commons/AppUpdateUtils.kt | 4 +- .../org/mtransit/android/commons/CursorExt.kt | 43 +++-- .../mtransit/android/commons/KeyboardUtils.kt | 6 +- .../org/mtransit/android/commons/MTLog.java | 7 +- .../android/commons/PreferenceUtils.java | 6 +- .../android/commons/data/AppStatus.java | 2 +- .../org/mtransit/android/commons/data/Area.kt | 6 +- .../commons/data/AvailabilityPercent.java | 2 +- .../android/commons/data/DefaultPOI.java | 2 +- .../mtransit/android/commons/data/News.java | 2 +- .../android/commons/data/POIStatus.java | 2 +- .../android/commons/data/RouteDirection.java | 8 +- .../android/commons/data/Schedule.java | 2 +- .../commons/data/ScheduleTimestamps.java | 2 +- .../android/commons/data/ServiceUpdate.java | 2 +- .../android/commons/data/ServiceUpdateKtx.kt | 2 +- .../org/mtransit/android/commons/data/Trip.kt | 30 +++ .../commons/provider/CaEdmontonProvider.java | 5 + .../commons/provider/CaLTCOnlineProvider.java | 5 + .../commons/provider/CaSTOProvider.java | 5 + .../commons/provider/CaTransLinkProvider.java | 5 + .../provider/CleverDevicesProvider.java | 5 + .../commons/provider/GBFSProvider.java | 7 + .../commons/provider/GTFSProvider.java | 14 +- .../provider/GTFSProviderContract.java | 18 +- .../provider/GTFSRealTimeProvider.java | 145 ++++++++------ .../provider/GrandRiverTransitProvider.java | 5 + .../provider/GreaterSudburyProvider.java | 5 + .../commons/provider/InstagramNewsProvider.kt | 3 + .../provider/JCDecauxBikeStationProvider.java | 7 + .../commons/provider/NextBusProvider.java | 8 + .../commons/provider/OCTranspoProvider.java | 8 + .../commons/provider/OneBusAwayProvider.java | 5 + .../commons/provider/RSSNewsProvider.java | 2 + .../commons/provider/RTCQuebecProvider.java | 9 +- .../provider/ReginaTransitProvider.java | 5 + .../commons/provider/StmInfoApiProvider.java | 9 + .../provider/StmInfoSubwayProvider.java | 5 + .../provider/StrategicMappingProvider.java | 5 + .../commons/provider/TwitterNewsProvider.kt | 3 + .../provider/WinnipegTransitProvider.java | 7 + .../commons/provider/YouTubeNewsProvider.kt | 5 + .../provider/{ => agency}/AgencyProvider.java | 5 +- .../{ => agency}/AgencyProviderContract.java | 4 +- .../AgencyProviderDeployWorker.kt | 20 +- .../{ => bike}/BikeStationDbHelper.java | 9 +- .../{ => bike}/BikeStationProvider.java | 29 +-- .../ContentProviderConstants.java | 4 +- .../{ => common}/MTContentProvider.java | 2 +- .../{ => common}/MTSQLiteOpenHelper.java | 2 +- .../MTSearchRecentSuggestionsProvider.java | 2 +- .../{ => common}/ProviderContract.java | 2 +- .../gbfs/data/api/v3/GBFSDateAdapter.kt | 4 +- .../{ => gtfs}/GTFSCurrentNextProvider.java | 11 +- .../provider/{ => gtfs}/GTFSPOIProvider.java | 7 +- .../gtfs/GTFSProviderDBHelperUtils.kt | 93 +++++---- .../{ => gtfs}/GTFSProviderDbHelper.java | 57 ++++-- .../provider/{ => gtfs}/GTFSRDSProvider.java | 177 ++++++++++++++++-- .../provider/gtfs/GTFSRealTimeProviderExt.kt | 40 ++++ .../GTFSScheduleTimestampsProvider.java | 11 +- .../{ => gtfs}/GTFSStatusProvider.java | 44 +++-- .../commons/provider/gtfs/GTFSStringsUtils.kt | 1 - .../commons/provider/gtfs/GTFSTripIdsUtils.kt | 1 - .../provider/gtfs/GtfsRealTimeStorage.kt | 5 + .../commons/provider/gtfs/GtfsRealtimeExt.kt | 105 ++++------- .../provider/{ => news}/NewsProvider.java | 17 +- .../{ => news}/NewsProviderContract.java | 3 +- .../news/twitter/TwitterDateAdapter.kt | 4 +- .../news/twitter/TwitterNewsDbHelper.kt | 2 +- .../news/youtube/YouTubeDateAdapter.kt | 4 +- .../news/youtube/YouTubeNewsDbHelper.kt | 4 +- .../provider/{ => poi}/POIProvider.java | 8 +- .../{ => poi}/POIProviderContract.java | 4 +- .../ScheduleTimestampsProvider.java | 5 +- .../ScheduleTimestampsProviderContract.java | 3 +- .../ServiceUpdateCleaner.kt | 3 +- .../ServiceUpdateProvider.java | 10 +- .../ServiceUpdateProviderContract.java | 11 +- .../provider/{ => status}/StatusProvider.java | 5 +- .../{ => status}/StatusProviderContract.java | 3 +- .../commons/receiver/GenericReceiver.kt | 8 +- .../commons/receiver/ModuleReceiver.kt | 9 +- .../android/commons/ui/AppUpdateActivity.kt | 4 +- .../android/commons/ui/InvisibleActivity.kt | 4 +- .../commons/ui/ModuleRedirectActivity.java | 2 +- ...hedule_trip_ids => current_gtfs_rts_paths} | 0 .../raw/current_gtfs_schedule_path_ids} | 0 .../raw/next_gtfs_rts_paths} | 0 .../res-next/raw/next_gtfs_schedule_path_ids | 0 src/main/res/raw/gtfs_rts_paths | 0 src/main/res/raw/gtfs_schedule_path_ids | 0 src/main/res/values/constants.xml | 1 + src/main/res/values/gtfs_real_time_values.xml | 3 + .../{ => gtfs}/GTFSStatusProviderTest.kt | 3 +- 97 files changed, 898 insertions(+), 338 deletions(-) create mode 100755 pub/generate_all_dpis_from_xxxhdpi.sh create mode 100644 src/main/java/org/mtransit/android/commons/data/Trip.kt rename src/main/java/org/mtransit/android/commons/provider/{ => agency}/AgencyProvider.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => agency}/AgencyProviderContract.java (87%) rename src/main/java/org/mtransit/android/commons/provider/{ => agency}/AgencyProviderDeployWorker.kt (80%) rename src/main/java/org/mtransit/android/commons/provider/{ => bike}/BikeStationDbHelper.java (86%) rename src/main/java/org/mtransit/android/commons/provider/{ => bike}/BikeStationProvider.java (94%) rename src/main/java/org/mtransit/android/commons/provider/{ => common}/ContentProviderConstants.java (92%) rename src/main/java/org/mtransit/android/commons/provider/{ => common}/MTContentProvider.java (98%) rename src/main/java/org/mtransit/android/commons/provider/{ => common}/MTSQLiteOpenHelper.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => common}/MTSearchRecentSuggestionsProvider.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => common}/ProviderContract.java (92%) rename src/main/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSCurrentNextProvider.java (94%) rename src/main/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSPOIProvider.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSProviderDbHelper.java (84%) rename src/main/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSRDSProvider.java (74%) create mode 100644 src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt rename src/main/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSScheduleTimestampsProvider.java (90%) rename src/main/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSStatusProvider.java (96%) rename src/main/java/org/mtransit/android/commons/provider/{ => news}/NewsProvider.java (96%) rename src/main/java/org/mtransit/android/commons/provider/{ => news}/NewsProviderContract.java (99%) rename src/main/java/org/mtransit/android/commons/provider/{ => poi}/POIProvider.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => poi}/POIProviderContract.java (99%) rename src/main/java/org/mtransit/android/commons/provider/{ => scheduletimestamp}/ScheduleTimestampsProvider.java (89%) rename src/main/java/org/mtransit/android/commons/provider/{ => scheduletimestamp}/ScheduleTimestampsProviderContract.java (96%) rename src/main/java/org/mtransit/android/commons/provider/{ => serviceupdate}/ServiceUpdateCleaner.kt (98%) rename src/main/java/org/mtransit/android/commons/provider/{ => serviceupdate}/ServiceUpdateProvider.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => serviceupdate}/ServiceUpdateProviderContract.java (97%) rename src/main/java/org/mtransit/android/commons/provider/{ => status}/StatusProvider.java (98%) rename src/main/java/org/mtransit/android/commons/provider/{ => status}/StatusProviderContract.java (98%) rename src/main/res-current/raw/{current_gtfs_schedule_trip_ids => current_gtfs_rts_paths} (100%) rename src/main/{res-next/raw/next_gtfs_schedule_trip_ids => res-current/raw/current_gtfs_schedule_path_ids} (100%) rename src/main/{res/raw/gtfs_schedule_trip_ids => res-next/raw/next_gtfs_rts_paths} (100%) create mode 100644 src/main/res-next/raw/next_gtfs_schedule_path_ids create mode 100644 src/main/res/raw/gtfs_rts_paths create mode 100644 src/main/res/raw/gtfs_schedule_path_ids rename src/test/java/org/mtransit/android/commons/provider/{ => gtfs}/GTFSStatusProviderTest.kt (98%) diff --git a/pub/generate_all_dpis_from_xxxhdpi.sh b/pub/generate_all_dpis_from_xxxhdpi.sh new file mode 100755 index 00000000..225e0dbc --- /dev/null +++ b/pub/generate_all_dpis_from_xxxhdpi.sh @@ -0,0 +1,48 @@ +#!/bin/bash +set -euo pipefail # -x + +if [[ "$#" -ne 1 ]]; then + echo "> Wrong $# parameters '$*'!" + exit 1 #error +fi + +SOURCE=$1 +echo "SOURCE: $SOURCE." + +if [ ! -f "$SOURCE" ]; then + echo "> File '$SOURCE' does not exist!" + exit 1 #error +fi + +SOURCE_DIR=$(dirname "$SOURCE") +echo "SOURCE_DIR: $SOURCE_DIR." + +SOURCE_NAME=$(basename "$SOURCE") +echo "SOURCE_NAME: $SOURCE_NAME." + +SOURCE_DIR_NAME=$(basename "$SOURCE_DIR") +echo "SOURCE_DIR_NAME: $SOURCE_DIR_NAME." + +if [ "$SOURCE_DIR_NAME" != "drawable-xxxhdpi" ]; then + echo "> Wrong source drawable DPI '$SOURCE_DIR_NAME'!" + exit 1 #error +fi + +RES_DIR=$(dirname "$SOURCE_DIR") +echo "RES_DIR: $RES_DIR." + +RES_DIR_NAME=$(basename "$RES_DIR") +echo "RES_DIR_NAME: $RES_DIR_NAME." + +if [ "$RES_DIR_NAME" != "res" ]; then + echo "> Wrong source resource directory '$RES_DIR_NAME'!" + exit 1 #error +fi + +convert $SOURCE -resize 75% $RES_DIR/drawable-xxhdpi/$SOURCE_NAME +convert $SOURCE -resize 50% $RES_DIR/drawable-xhdpi/$SOURCE_NAME +convert $SOURCE -resize 37.5% $RES_DIR/drawable-hdpi/$SOURCE_NAME +convert $SOURCE -resize 25% $RES_DIR/drawable-mdpi/$SOURCE_NAME + +echo "Done" +exit 0 #ok diff --git a/src/debug/res/values/constants.xml b/src/debug/res/values/constants.xml index 39787d54..19c858ec 100644 --- a/src/debug/res/values/constants.xml +++ b/src/debug/res/values/constants.xml @@ -8,6 +8,7 @@ org.mtransit.android.debug.provider.ROUTE_TRIP_STOP_PROVIDER org.mtransit.android.debug.provider.SCHEDULE_PROVIDER + org.mtransit.android.debug.providerSCHEDULE_PROVIDER_TARGET org.mtransit.android.debug.provider.SERVICE_UPDATE_PROVIDER org.mtransit.android.debug.provider.SERVICE_UPDATE_PROVIDER_TARGET diff --git a/src/main/java/org/mtransit/android/commons/AppUpdateLauncher.kt b/src/main/java/org/mtransit/android/commons/AppUpdateLauncher.kt index 24173da5..e320c709 100644 --- a/src/main/java/org/mtransit/android/commons/AppUpdateLauncher.kt +++ b/src/main/java/org/mtransit/android/commons/AppUpdateLauncher.kt @@ -7,9 +7,9 @@ import org.mtransit.android.commons.ui.AppUpdateActivity object AppUpdateLauncher : MTLog.Loggable { - val LOG_TAG: String = AppUpdateLauncher::class.java.simpleName + private val LOG_TAG: String = AppUpdateLauncher::class.java.simpleName - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG @Suppress("SimplifyBooleanWithConstants", "KotlinConstantConditions") @JvmStatic diff --git a/src/main/java/org/mtransit/android/commons/AppUpdateUtils.kt b/src/main/java/org/mtransit/android/commons/AppUpdateUtils.kt index 26fa2ecd..7affda47 100644 --- a/src/main/java/org/mtransit/android/commons/AppUpdateUtils.kt +++ b/src/main/java/org/mtransit/android/commons/AppUpdateUtils.kt @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit object AppUpdateUtils : MTLog.Loggable { - val LOG_TAG: String = AppUpdateUtils::class.java.simpleName + private val LOG_TAG: String = AppUpdateUtils::class.java.simpleName private const val FORCE_CHECK_IN_DEBUG = false // private const val FORCE_CHECK_IN_DEBUG = true // DEBUG @@ -28,7 +28,7 @@ object AppUpdateUtils : MTLog.Loggable { private const val FORCE_UPDATE_AVAILABLE = false // private const val FORCE_UPDATE_AVAILABLE = true // DEBUG - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG private const val PREF_KEY_AVAILABLE_VERSION_CODE = "pAvailableVersionCode" diff --git a/src/main/java/org/mtransit/android/commons/CursorExt.kt b/src/main/java/org/mtransit/android/commons/CursorExt.kt index 58a9cd55..b10fb88c 100644 --- a/src/main/java/org/mtransit/android/commons/CursorExt.kt +++ b/src/main/java/org/mtransit/android/commons/CursorExt.kt @@ -1,3 +1,5 @@ +@file:Suppress("unused") + package org.mtransit.android.commons import android.database.Cursor @@ -17,17 +19,28 @@ fun Cursor.getDouble(columnName: String) = this.getDouble(getColumnIndexOrThrow( // endregion +// region Float + +fun Cursor.getFloat(columnName: String) = this.getFloat(getColumnIndexOrThrow(columnName)) + +fun Cursor.optFloat(columnIndex: Int, fallback: Float? = null) = + optNotNull(columnIndex)?.let { getFloat(it) } ?: fallback + +fun Cursor.optFloat(columnName: String, fallback: Float? = null) = + this.optFloat(getColumnIndex(columnName), fallback) + +// endregion + // region Int -fun Cursor.optInt(columnIndex: Int, fallback: Int? = null): Int? { - return optNotNull(columnIndex)?.let { getInt(it) } ?: fallback -} +fun Cursor.optInt(columnIndex: Int, fallback: Int? = null) = + optNotNull(columnIndex)?.let { getInt(it) } ?: fallback -fun Cursor.optInt(columnName: String, fallback: Int? = null) = this.optInt(getColumnIndex(columnName), fallback) +fun Cursor.optInt(columnName: String, fallback: Int? = null) = + this.optInt(getColumnIndex(columnName), fallback) -fun Cursor.optIntNN(columnIndex: Int, fallback: Int): Int { - return optNotNull(columnIndex)?.let { getInt(it) } ?: fallback -} +fun Cursor.optIntNN(columnIndex: Int, fallback: Int) = + optNotNull(columnIndex)?.let { getInt(it) } ?: fallback fun Cursor.optIntNN(columnName: String, fallback: Int) = this.optIntNN(getColumnIndex(columnName), fallback) @@ -39,21 +52,25 @@ fun Cursor.getInt(columnName: String) = this.getInt(getColumnIndexOrThrow(column fun Cursor.getLong(columnName: String) = this.getLong(getColumnIndexOrThrow(columnName)) +fun Cursor.optLong(columnIndex: Int, fallback: Long? = null) = + optNotNull(columnIndex)?.let { getLong(it) } ?: fallback + +fun Cursor.optLong(columnName: String, fallback: Long? = null) = + this.optLong(getColumnIndex(columnName), fallback) + // endregion // region String fun Cursor.getString(columnName: String) = this.getString(getColumnIndexOrThrow(columnName)).orEmpty() -fun Cursor.optString(columnIndex: Int, fallback: String? = null): String? { - return optNotNull(columnIndex)?.let { getString(it) } ?: fallback -} +fun Cursor.optString(columnIndex: Int, fallback: String? = null) = + optNotNull(columnIndex)?.let { getString(it) } ?: fallback fun Cursor.optString(columnName: String, fallback: String? = null) = this.optString(getColumnIndex(columnName), fallback) -fun Cursor.optStringNN(columnIndex: Int, fallback: String): String { - return optNotNull(columnIndex)?.let { getString(it) } ?: fallback -} +fun Cursor.optStringNN(columnIndex: Int, fallback: String): String = + optNotNull(columnIndex)?.let { getString(it) } ?: fallback fun Cursor.optStringNN(columnName: String, fallback: String) = this.optStringNN(getColumnIndex(columnName), fallback) diff --git a/src/main/java/org/mtransit/android/commons/KeyboardUtils.kt b/src/main/java/org/mtransit/android/commons/KeyboardUtils.kt index 20773a46..eff3b270 100644 --- a/src/main/java/org/mtransit/android/commons/KeyboardUtils.kt +++ b/src/main/java/org/mtransit/android/commons/KeyboardUtils.kt @@ -8,12 +8,10 @@ import android.view.inputmethod.InputMethodManager @Suppress("unused") class KeyboardUtils : MTLog.Loggable { - override fun getLogTag(): String { - return TAG - } + override fun getLogTag() = LOG_TAG companion object { - private val TAG = KeyboardUtils::class.java.simpleName + private val LOG_TAG: String = KeyboardUtils::class.java.simpleName @JvmStatic fun showKeyboard(activity: Activity?, view: View?) { diff --git a/src/main/java/org/mtransit/android/commons/MTLog.java b/src/main/java/org/mtransit/android/commons/MTLog.java index 4331463e..15c12bb7 100644 --- a/src/main/java/org/mtransit/android/commons/MTLog.java +++ b/src/main/java/org/mtransit/android/commons/MTLog.java @@ -9,6 +9,7 @@ import java.util.Calendar; import java.util.Date; +import java.util.Locale; // adb logcat -s "MT" // adb logcat -s "MTD" @@ -367,11 +368,15 @@ private static void doLog(@NonNull LogMethod logMethod, @NonNull String logMsg) ); } + private static final ThreadSafeDateFormatter LOG_TIME_FORMAT = new ThreadSafeDateFormatter("yyyy-MM-dd_HH-mm-ss.SSS", Locale.ENGLISH); + private static String getLogMsg(@NonNull String tag, @NonNull String logMsg) { if (Constants.DEBUG) { logMsg = StringUtils.oneLineOneSpace(logMsg); } - return String.format("%s:%s>%s", TimeUtils.currentTimeMillis(), tag, logMsg); + final String time = BuildConfig.DEBUG ? LOG_TIME_FORMAT.formatThreadSafe(TimeUtils.currentTimeMillis()) + : String.valueOf(TimeUtils.currentTimeMillis()); + return String.format("%s:%s>%s", time, tag, logMsg); } private static void logEntireMessage(@NonNull LogMethod logMethod, String logMsg) { diff --git a/src/main/java/org/mtransit/android/commons/PreferenceUtils.java b/src/main/java/org/mtransit/android/commons/PreferenceUtils.java index db280857..e73cce8a 100644 --- a/src/main/java/org/mtransit/android/commons/PreferenceUtils.java +++ b/src/main/java/org/mtransit/android/commons/PreferenceUtils.java @@ -109,11 +109,11 @@ public static String getPREFS_LCL_RDS_ROUTE_DIRECTION_ID_TAB(@NonNull String aut return PREFS_LCL_RDS_ROUTE_DIRECTION_ID_TAB + authority + routeId; } - private static final String PREFS_LCL_RDS_ROUTE_DIRECTION_ID_KEY = "pRTSRouteTripIdKey"; // do not change to avoid breaking compat w/ old modules + private static final String PREFS_LCL_RDS_DIRECTION_SHOWING_LIST_INSTEAD_OF_MAP_KEY = "pRTSRouteTripIdKey"; // do not change to avoid breaking compat w/ old modules @NonNull - public static String getPREFS_LCL_RDS_ROUTE_DIRECTION_ID_KEY(@NonNull String authority, long routeId, long directionId) { - return PREFS_LCL_RDS_ROUTE_DIRECTION_ID_KEY + authority + routeId + "-" + directionId; + public static String getPREFS_LCL_RDS_DIRECTION_SHOWING_LIST_INSTEAD_OF_MAP_KEY(@NonNull String authority, long routeId, long directionId) { + return PREFS_LCL_RDS_DIRECTION_SHOWING_LIST_INSTEAD_OF_MAP_KEY + authority + routeId + "-" + directionId; } public static final String PREFS_LCL_MAP_FILTER_TYPE_IDS = "pMapFilterTypeIds"; diff --git a/src/main/java/org/mtransit/android/commons/data/AppStatus.java b/src/main/java/org/mtransit/android/commons/data/AppStatus.java index ac0514a8..016323fb 100644 --- a/src/main/java/org/mtransit/android/commons/data/AppStatus.java +++ b/src/main/java/org/mtransit/android/commons/data/AppStatus.java @@ -15,7 +15,7 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.R; import org.mtransit.android.commons.SpanUtils; -import org.mtransit.android.commons.provider.StatusProviderContract; +import org.mtransit.android.commons.provider.status.StatusProviderContract; @SuppressWarnings({"WeakerAccess", "unused"}) public class AppStatus extends POIStatus implements MTLog.Loggable { diff --git a/src/main/java/org/mtransit/android/commons/data/Area.kt b/src/main/java/org/mtransit/android/commons/data/Area.kt index bbb09c69..ebde240b 100644 --- a/src/main/java/org/mtransit/android/commons/data/Area.kt +++ b/src/main/java/org/mtransit/android/commons/data/Area.kt @@ -5,7 +5,7 @@ import androidx.room.Ignore import org.mtransit.android.commons.LocationUtils import org.mtransit.android.commons.MTLog import org.mtransit.android.commons.getDouble -import org.mtransit.android.commons.provider.AgencyProviderContract +import org.mtransit.android.commons.provider.agency.AgencyProviderContract import kotlin.math.abs import kotlin.math.max import kotlin.math.min @@ -23,7 +23,7 @@ data class Area( val maxLng: Double, ) : MTLog.Loggable { - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG @Ignore val northLat = this.maxLat @@ -73,7 +73,7 @@ data class Area( companion object { - private val LOG_TAG = Area::class.java.simpleName + private val LOG_TAG: String = Area::class.java.simpleName const val MAX_LAT: Double = 90.0 const val MIN_LAT: Double = -90.0 diff --git a/src/main/java/org/mtransit/android/commons/data/AvailabilityPercent.java b/src/main/java/org/mtransit/android/commons/data/AvailabilityPercent.java index d3ecea6c..e919a145 100644 --- a/src/main/java/org/mtransit/android/commons/data/AvailabilityPercent.java +++ b/src/main/java/org/mtransit/android/commons/data/AvailabilityPercent.java @@ -19,7 +19,7 @@ import org.mtransit.android.commons.R; import org.mtransit.android.commons.SpanUtils; import org.mtransit.android.commons.StringUtils; -import org.mtransit.android.commons.provider.StatusProviderContract; +import org.mtransit.android.commons.provider.status.StatusProviderContract; @SuppressWarnings({"WeakerAccess", "unused"}) public class AvailabilityPercent extends POIStatus implements MTLog.Loggable { diff --git a/src/main/java/org/mtransit/android/commons/data/DefaultPOI.java b/src/main/java/org/mtransit/android/commons/data/DefaultPOI.java index 8bdda295..3945f01c 100644 --- a/src/main/java/org/mtransit/android/commons/data/DefaultPOI.java +++ b/src/main/java/org/mtransit/android/commons/data/DefaultPOI.java @@ -17,7 +17,7 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.StringUtils; import org.mtransit.android.commons.data.DataSourceTypeId.DataSourceType; -import org.mtransit.android.commons.provider.POIProviderContract; +import org.mtransit.android.commons.provider.poi.POIProviderContract; import org.mtransit.commons.CommonsApp; import java.text.Normalizer; diff --git a/src/main/java/org/mtransit/android/commons/data/News.java b/src/main/java/org/mtransit/android/commons/data/News.java index ede811f7..4ec4a38c 100644 --- a/src/main/java/org/mtransit/android/commons/data/News.java +++ b/src/main/java/org/mtransit/android/commons/data/News.java @@ -13,7 +13,7 @@ import org.mtransit.android.commons.ColorUtils; import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.TimeUtils; -import org.mtransit.android.commons.provider.NewsProviderContract; +import org.mtransit.android.commons.provider.news.NewsProviderContract; import org.mtransit.commons.CollectionUtils; import java.util.ArrayList; diff --git a/src/main/java/org/mtransit/android/commons/data/POIStatus.java b/src/main/java/org/mtransit/android/commons/data/POIStatus.java index afd4b455..c14e28dc 100644 --- a/src/main/java/org/mtransit/android/commons/data/POIStatus.java +++ b/src/main/java/org/mtransit/android/commons/data/POIStatus.java @@ -17,7 +17,7 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.SpanUtils; import org.mtransit.android.commons.TimeUtils; -import org.mtransit.android.commons.provider.StatusProviderContract; +import org.mtransit.android.commons.provider.status.StatusProviderContract; // TODO abstract public class POIStatus implements MTLog.Loggable { diff --git a/src/main/java/org/mtransit/android/commons/data/RouteDirection.java b/src/main/java/org/mtransit/android/commons/data/RouteDirection.java index 891f9fdd..86ff32f3 100644 --- a/src/main/java/org/mtransit/android/commons/data/RouteDirection.java +++ b/src/main/java/org/mtransit/android/commons/data/RouteDirection.java @@ -70,11 +70,9 @@ public String toString() { @SuppressWarnings("unused") @NonNull public String toStringSimple() { - StringBuilder sb = new StringBuilder(); - sb.append(getRoute().getShortName()).append('-'); - sb.append(getDirection().getHeadsignValue()).append('>'); - sb.append('(').append(getAuthority()).append(')'); - return sb.toString(); + return getRoute().getShortName() + '-' + + getDirection().getHeadsignValue() + '>' + + '(' + getAuthority() + ')'; } @SuppressWarnings("unused") diff --git a/src/main/java/org/mtransit/android/commons/data/Schedule.java b/src/main/java/org/mtransit/android/commons/data/Schedule.java index 9f2cbbff..52a31afa 100644 --- a/src/main/java/org/mtransit/android/commons/data/Schedule.java +++ b/src/main/java/org/mtransit/android/commons/data/Schedule.java @@ -17,7 +17,7 @@ import org.mtransit.android.commons.R; import org.mtransit.android.commons.StringUtils; import org.mtransit.android.commons.TimeUtils; -import org.mtransit.android.commons.provider.StatusProviderContract; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CollectionUtils; import java.util.ArrayList; diff --git a/src/main/java/org/mtransit/android/commons/data/ScheduleTimestamps.java b/src/main/java/org/mtransit/android/commons/data/ScheduleTimestamps.java index 9f8e94b7..b9d55846 100644 --- a/src/main/java/org/mtransit/android/commons/data/ScheduleTimestamps.java +++ b/src/main/java/org/mtransit/android/commons/data/ScheduleTimestamps.java @@ -10,7 +10,7 @@ import org.json.JSONException; import org.json.JSONObject; import org.mtransit.android.commons.MTLog; -import org.mtransit.android.commons.provider.ScheduleTimestampsProviderContract; +import org.mtransit.android.commons.provider.scheduletimestamp.ScheduleTimestampsProviderContract; import org.mtransit.commons.CollectionUtils; import java.util.ArrayList; diff --git a/src/main/java/org/mtransit/android/commons/data/ServiceUpdate.java b/src/main/java/org/mtransit/android/commons/data/ServiceUpdate.java index 45887d0d..0a9b97f3 100644 --- a/src/main/java/org/mtransit/android/commons/data/ServiceUpdate.java +++ b/src/main/java/org/mtransit/android/commons/data/ServiceUpdate.java @@ -11,7 +11,7 @@ import org.mtransit.android.commons.CursorExtKt; import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.TimeUtils; -import org.mtransit.android.commons.provider.ServiceUpdateProviderContract; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; import java.util.Comparator; diff --git a/src/main/java/org/mtransit/android/commons/data/ServiceUpdateKtx.kt b/src/main/java/org/mtransit/android/commons/data/ServiceUpdateKtx.kt index 333311ec..ee4e62a0 100644 --- a/src/main/java/org/mtransit/android/commons/data/ServiceUpdateKtx.kt +++ b/src/main/java/org/mtransit/android/commons/data/ServiceUpdateKtx.kt @@ -3,7 +3,7 @@ package org.mtransit.android.commons.data import org.mtransit.android.commons.MTLog import org.mtransit.android.commons.StringUtils import org.mtransit.android.commons.TimeUtils -import org.mtransit.android.commons.provider.ServiceUpdateProviderContract +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract fun ServiceUpdate.syncTargetUUID(targetUUIDs: Map?) { targetUUIDs?.takeIf { it.isNotEmpty() } ?: return diff --git a/src/main/java/org/mtransit/android/commons/data/Trip.kt b/src/main/java/org/mtransit/android/commons/data/Trip.kt new file mode 100644 index 00000000..9a13c16e --- /dev/null +++ b/src/main/java/org/mtransit/android/commons/data/Trip.kt @@ -0,0 +1,30 @@ +package org.mtransit.android.commons.data + +import android.database.Cursor +import org.mtransit.android.commons.MTLog +import org.mtransit.android.commons.getLong +import org.mtransit.android.commons.getString +import org.mtransit.android.commons.provider.GTFSProviderContract + +data class Trip( + val tripId: String, + val routeId: Long, + val directionId: Long, + val serviceId: String, +) : MTLog.Loggable { + + companion object { + private val LOG_TAG: String = Trip::class.java.simpleName + + @JvmStatic + fun fromCursor(c: Cursor) = Trip( + tripId = c.getString(GTFSProviderContract.TripColumns.T_TRIP_K_TRIP_ID), + routeId = c.getLong(GTFSProviderContract.TripColumns.T_TRIP_K_ROUTE_ID), + directionId = c.getLong(GTFSProviderContract.TripColumns.T_TRIP_K_DIRECTION_ID), + serviceId = c.getString(GTFSProviderContract.TripColumns.T_TRIP_K_SERVICE_ID), + ) + } + + override fun getLogTag() = LOG_TAG +} + diff --git a/src/main/java/org/mtransit/android/commons/provider/CaEdmontonProvider.java b/src/main/java/org/mtransit/android/commons/provider/CaEdmontonProvider.java index dbe0adb1..0e51e0e2 100644 --- a/src/main/java/org/mtransit/android/commons/provider/CaEdmontonProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/CaEdmontonProvider.java @@ -32,6 +32,10 @@ import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; @@ -51,6 +55,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class CaEdmontonProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/CaLTCOnlineProvider.java b/src/main/java/org/mtransit/android/commons/provider/CaLTCOnlineProvider.java index 03e04a7d..216e0304 100644 --- a/src/main/java/org/mtransit/android/commons/provider/CaLTCOnlineProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/CaLTCOnlineProvider.java @@ -35,6 +35,10 @@ import org.mtransit.android.commons.provider.CaLTCOnlineProvider.JBusTimes.JResult.JRealTimeResult; import org.mtransit.android.commons.provider.CaLTCOnlineProvider.JBusTimes.JResult.JStopTimeResult; import org.mtransit.android.commons.provider.CaLTCOnlineProvider.JBusTimes.JResult.JStopTimeResult.JStopTime; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; @@ -57,6 +61,7 @@ import javax.net.ssl.HttpsURLConnection; +// DO NOT MOVE: referenced in modules AndroidManifest.xml // Nov 15, 2020: DOES NOT WORK because Real-Time API stop IDs do not match with GTFS static (DISABLED) @SuppressLint("Registered") public class CaLTCOnlineProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/CaSTOProvider.java b/src/main/java/org/mtransit/android/commons/provider/CaSTOProvider.java index 9313f550..0ad27d44 100644 --- a/src/main/java/org/mtransit/android/commons/provider/CaSTOProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/CaSTOProvider.java @@ -29,6 +29,10 @@ import org.mtransit.android.commons.UriUtils; import org.mtransit.android.commons.data.News; import org.mtransit.android.commons.helpers.MTDefaultHandler; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.news.NewsProvider; +import org.mtransit.android.commons.provider.news.NewsProviderContract; import org.mtransit.android.commons.provider.news.NewsTextFormatter; import org.mtransit.commons.SourceUtils; import org.xml.sax.Attributes; @@ -56,6 +60,7 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +// DO NOT MOVE: referenced in modules AndroidManifest.xml /** @noinspection deprecation*/ @Deprecated // web site updated, not working anymore @SuppressLint("Registered") diff --git a/src/main/java/org/mtransit/android/commons/provider/CaTransLinkProvider.java b/src/main/java/org/mtransit/android/commons/provider/CaTransLinkProvider.java index 3d193fe3..43dc564e 100644 --- a/src/main/java/org/mtransit/android/commons/provider/CaTransLinkProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/CaTransLinkProvider.java @@ -32,6 +32,10 @@ import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; import org.mtransit.commons.provider.CaVancouverTransLinkProviderCommons; @@ -50,6 +54,7 @@ import java.util.TimeZone; import java.util.concurrent.TimeUnit; +// DO NOT MOVE: referenced in modules AndroidManifest.xml // The RTTI Open API is deprecated and will no longer be available after December 2, 2024. // https://www.translink.ca/about-us/doing-business-with-translink/app-developer-resources/rtti @Deprecated diff --git a/src/main/java/org/mtransit/android/commons/provider/CleverDevicesProvider.java b/src/main/java/org/mtransit/android/commons/provider/CleverDevicesProvider.java index 88e76c49..76ebd869 100644 --- a/src/main/java/org/mtransit/android/commons/provider/CleverDevicesProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/CleverDevicesProvider.java @@ -30,6 +30,10 @@ import org.mtransit.android.commons.data.Schedule.Timestamp; import org.mtransit.android.commons.helpers.MTDefaultHandler; import org.mtransit.android.commons.provider.agency.AgencyUtils; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.SourceUtils; @@ -54,6 +58,7 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class CleverDevicesProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/GBFSProvider.java b/src/main/java/org/mtransit/android/commons/provider/GBFSProvider.java index 5152a864..86ce23b4 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GBFSProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GBFSProvider.java @@ -22,7 +22,13 @@ import org.mtransit.android.commons.data.POI; import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.POITools; +import org.mtransit.android.commons.provider.bike.BikeStationDbHelper; +import org.mtransit.android.commons.provider.bike.BikeStationProvider; import org.mtransit.android.commons.provider.gbfs.GBFSStorage; +import org.mtransit.android.commons.provider.poi.POIProvider; +import org.mtransit.android.commons.provider.poi.POIProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.SourceUtils; import java.net.HttpURLConnection; @@ -36,6 +42,7 @@ import javax.net.ssl.SSLHandshakeException; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class GBFSProvider extends BikeStationProvider { diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSProvider.java b/src/main/java/org/mtransit/android/commons/provider/GTFSProvider.java index 8a8f6db0..295a5117 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSProvider.java @@ -28,12 +28,24 @@ import org.mtransit.android.commons.data.DataSourceTypeId; import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.ScheduleTimestamps; +import org.mtransit.android.commons.provider.agency.AgencyProvider; +import org.mtransit.android.commons.provider.bike.BikeStationProvider; +import org.mtransit.android.commons.provider.gtfs.GTFSCurrentNextProvider; +import org.mtransit.android.commons.provider.gtfs.GTFSPOIProvider; +import org.mtransit.android.commons.provider.gtfs.GTFSProviderDbHelper; +import org.mtransit.android.commons.provider.gtfs.GTFSRDSProvider; +import org.mtransit.android.commons.provider.gtfs.GTFSScheduleTimestampsProvider; +import org.mtransit.android.commons.provider.gtfs.GTFSStatusProvider; +import org.mtransit.android.commons.provider.poi.POIProviderContract; +import org.mtransit.android.commons.provider.scheduletimestamp.ScheduleTimestampsProviderContract; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import java.io.BufferedReader; import java.io.InputStreamReader; @SuppressWarnings("WeakerAccess") -@SuppressLint({"Registered"}) +// DO NOT MOVE: referenced in modules AndroidManifest.xml +@SuppressLint("Registered") public class GTFSProvider extends AgencyProvider implements POIProviderContract, StatusProviderContract, ScheduleTimestampsProviderContract, GTFSProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderContract.java index abdecebf..82688fba 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSProviderContract.java @@ -5,10 +5,11 @@ import androidx.annotation.NonNull; import org.mtransit.android.commons.ArrayUtils; +import org.mtransit.android.commons.provider.poi.POIProvider; import java.util.ArrayList; -@SuppressWarnings("WeakerAccess") +@SuppressWarnings("WeakerAccess") // used from main app public interface GTFSProviderContract { String POI_FILTER_EXTRA_NO_PICKUP = "descentOnly"; @@ -21,6 +22,7 @@ public interface GTFSProviderContract { String ROUTE_DIRECTION_STOP_SEARCH_PATH = "route/trip/stop/*"; // do not change to avoid breaking compat w/ old modules String ROUTE_DIRECTION_PATH = "route/trip"; // do not change to avoid breaking compat w/ old modules String DIRECTION_STOP_PATH = "trip/stop"; // do not change to avoid breaking compat w/ old modules + String TRIP_PATH = "path"; // do not change to avoid breaking compat w/ old modules @NonNull static String[] makePROJECTION_ROUTE_DIRECTION_STOP() { @@ -75,6 +77,13 @@ static String[] makePROJECTION_ROUTE() { String[] PROJECTION_RDS_POI = ArrayUtils.addAllNonNull(POIProvider.PROJECTION_POI, PROJECTION_ROUTE_DIRECTION_STOP); + String[] PROJECTION_TRIP = new String[] { + TripColumns.T_TRIP_K_TRIP_ID, + TripColumns.T_TRIP_K_ROUTE_ID, + TripColumns.T_TRIP_K_DIRECTION_ID, + TripColumns.T_TRIP_K_SERVICE_ID + }; + class RouteColumns { public static final String T_ROUTE_K_ID = BaseColumns._ID; public static final String T_ROUTE_K_SHORT_NAME = "short_name"; @@ -160,4 +169,11 @@ class DirectionStopColumns { public static final String T_DIRECTION_STOPS_K_STOP_SEQUENCE = T_DIRECTION_STOPS + "_" + "stop_sequence"; public static final String T_DIRECTION_STOPS_K_NO_PICKUP = T_DIRECTION_STOPS + "_" + "decent_only"; } + + class TripColumns { + public static final String T_TRIP_K_TRIP_ID = "trip_id"; + public static final String T_TRIP_K_ROUTE_ID = "route_id"; + public static final String T_TRIP_K_DIRECTION_ID = "direction_id"; + public static final String T_TRIP_K_SERVICE_ID = "service_id"; + } } 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 dc156c0a..77e61a6c 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GTFSRealTimeProvider.java @@ -41,9 +41,16 @@ import org.mtransit.android.commons.data.ServiceUpdateKtxKt; import org.mtransit.android.commons.data.Stop; import org.mtransit.android.commons.provider.agency.AgencyUtils; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.gtfs.GTFSRDSProvider; +import org.mtransit.android.commons.provider.gtfs.GTFSRealTimeProviderExtKt; import org.mtransit.android.commons.provider.gtfs.GtfsRealTimeStorage; import org.mtransit.android.commons.provider.gtfs.GtfsRealtimeExt; import org.mtransit.android.commons.provider.gtfs.alert.GTFSRTAlertsManager; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateCleaner; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; import org.mtransit.commons.Cleaner; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.GTFSCommons; @@ -51,7 +58,6 @@ import java.net.HttpURLConnection; import java.net.SocketException; -import java.net.URL; import java.net.UnknownHostException; import java.security.MessageDigest; import java.text.ParseException; @@ -77,8 +83,10 @@ import okhttp3.Request; import okhttp3.Response; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") -public class GTFSRealTimeProvider extends MTContentProvider implements ServiceUpdateProviderContract { +public class GTFSRealTimeProvider extends MTContentProvider implements + ServiceUpdateProviderContract { private static final String LOG_TAG = GTFSRealTimeProvider.class.getSimpleName(); @@ -88,7 +96,7 @@ public String getLogTag() { return LOG_TAG; } - private static final String MT_HASH_SECRET_AND_DATE = "MtHashSecretAndDate"; + public static final String MT_HASH_SECRET_AND_DATE = "MtHashSecretAndDate"; @NonNull private static UriMatcher getNewUriMatcher(String authority) { @@ -118,7 +126,7 @@ private static UriMatcher getURIMATCHER(@NonNull Context context) { * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. */ @NonNull - private static String getAUTHORITY(@NonNull Context context) { + public static String getAUTHORITY(@NonNull Context context) { if (authority == null) { authority = context.getResources().getString(R.string.gtfs_real_time_authority); } @@ -202,7 +210,7 @@ private static java.util.List getAGENCY_EXTRA_BOLD_WORDS(@NonNull Contex * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. */ @NonNull - private static String getAGENCY_URL_TOKEN(@NonNull Context context) { + public static String getAGENCY_URL_TOKEN(@NonNull Context context) { if (agencyUrlToken == null) { agencyUrlToken = context.getResources().getString(R.string.gtfs_real_time_agency_url_token); } @@ -210,7 +218,7 @@ private static String getAGENCY_URL_TOKEN(@NonNull Context context) { } @Nullable - private String providedAgencyUrlToken = null; + public String providedAgencyUrlToken = null; @Nullable private static String agencyUrlSecret = null; @@ -235,13 +243,41 @@ private static String getAGENCY_URL_SECRET(@NonNull Context context) { /** * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. */ - private static boolean isUSE_URL_HASH_SECRET_AND_DATE(@NonNull Context context) { + public static boolean isUSE_URL_HASH_SECRET_AND_DATE(@NonNull Context context) { if (useURLHashSecretAndDate == null) { useURLHashSecretAndDate = context.getResources().getBoolean(R.bool.gtfs_real_time_url_use_hash_secret_and_date); } return useURLHashSecretAndDate; } + @Nullable + private static java.util.List agencyUrlHeaderName = null; + + /** + * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. + */ + @NonNull + public static java.util.List getAGENCY_URL_HEADER_NAMES(@NonNull Context context) { + if (agencyUrlHeaderName == null) { + agencyUrlHeaderName = Arrays.asList(context.getResources().getStringArray(R.array.gtfs_real_time_agency_url_header_names)); + } + return agencyUrlHeaderName; + } + + @Nullable + private static java.util.List agencyUrlHeaderValue = null; + + /** + * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. + */ + @NonNull + public static java.util.List getAGENCY_URL_HEADER_VALUES(@NonNull Context context) { + if (agencyUrlHeaderValue == null) { + agencyUrlHeaderValue = Arrays.asList(context.getResources().getStringArray(R.array.gtfs_real_time_agency_url_header_values)); + } + return agencyUrlHeaderValue; + } + @Nullable private static String agencyServiceAlertsUrl = null; @@ -273,6 +309,19 @@ private static String getAGENCY_SERVICE_ALERTS_URL_CACHED(@NonNull Context conte return agencyServiceAlertsUrlCached; } + @Nullable + private static Boolean ignoreDirection = null; + + /** + * Override if multiple {@link GTFSRealTimeProvider} implementations in same app. + */ + private static boolean isIGNORE_DIRECTION(@NonNull Context context) { + if (ignoreDirection == null) { + ignoreDirection = context.getResources().getBoolean(R.bool.gtfs_real_time_agency_ignore_direction); + } + return ignoreDirection; + } + @Nullable private static String serviceIdCleanupRegex = null; @@ -601,7 +650,7 @@ protected static String getAgencyStopTagTargetUUID(@NonNull String agencyTag, @N } @NonNull - protected static String getAgencyRouteTagTargetUUID(@NonNull String agencyTag, @NonNull String routeTag) { + public static String getAgencyRouteTagTargetUUID(@NonNull String agencyTag, @NonNull String routeTag) { return POI.POIUtils.getUUID(agencyTag, "ri" + routeTag); } @@ -617,7 +666,7 @@ protected static String getAgencyRouteTypeTagTargetUUID(@NonNull String agencyTa } @Nullable - protected static String getAgencyRouteDirectionTagTargetUUID(@NonNull String agencyTag, @NonNull String routeTag, @Nullable Integer directionTag) { + public static String getAgencyRouteDirectionTagTargetUUID(@NonNull String agencyTag, @NonNull String routeTag, @Nullable Integer directionTag) { if (directionTag == null) return null; return POI.POIUtils.getUUID(agencyTag, "ri" + routeTag, "d" + directionTag); } @@ -629,7 +678,7 @@ protected static String getAgencyRouteDirectionStopTagTargetUUID(@NonNull String } @NonNull - protected static String getAgencyTagTargetUUID(@NonNull String agencyTag) { + public static String getAgencyTagTargetUUID(@NonNull String agencyTag) { return POI.POIUtils.getUUID(agencyTag); } @@ -783,34 +832,12 @@ private OkHttpClient getOkHttpClient(@NonNull Context context) { @Nullable private ArrayList loadAgencyServiceUpdateDataFromWWW(@NonNull Context context) { try { - final URL url; - String urlCachedString = getAGENCY_SERVICE_ALERTS_URL_CACHED(context); - if (urlCachedString.isBlank()) { - String token = getAGENCY_URL_TOKEN(context); // use local token 1st for new/updated API URL & tokens - if (token.isBlank()) { - token = this.providedAgencyUrlToken; - } - if (token == null) { - token = ""; // compat w/ API w/o token - } - String urlString = getAgencyServiceAlertsUrlString(context, token); - if (isUSE_URL_HASH_SECRET_AND_DATE(context)) { - final String hash = getHashSecretAndDate(context); - if (hash != null) { - urlString = urlString.replaceAll(MT_HASH_SECRET_AND_DATE, hash.trim()); - } - } - url = new URL(urlString); - MTLog.i(this, "Loading from '%s'...", url.getHost()); - MTLog.d(this, "Using token '%s' (length: %d)", !token.isEmpty() ? "***" : "(none)", token.length()); - } else { - url = new URL(urlCachedString); - MTLog.i(this, "Loading from cached API (length: %d) '***'...", urlCachedString.length()); - } - final String sourceLabel = SourceUtils.getSourceLabel( // always use source from official API - getAgencyServiceAlertsUrlString(context, "T") + final Request urlRequest = GTFSRealTimeProviderExtKt.makeRequest(this, + context, + getAGENCY_SERVICE_ALERTS_URL_CACHED(context), + token -> getAgencyServiceAlertsUrlString(context, token) ); - final Request urlRequest = new Request.Builder().url(url).build(); + if (urlRequest == null) return null; try (Response response = getOkHttpClient(context).newCall(urlRequest).execute()) { setServiceUpdateLastUpdateCode(response.code()); GtfsRealTimeStorage.saveServiceUpdateLastUpdateMs(context, TimeUtils.currentTimeMillis()); @@ -818,16 +845,20 @@ private ArrayList loadAgencyServiceUpdateDataFromWWW(@NonNull Con case HttpURLConnection.HTTP_OK: final long newLastUpdateInMs = TimeUtils.currentTimeMillis(); final ArrayList serviceUpdates = new ArrayList<>(); + final String sourceLabel = SourceUtils.getSourceLabel( // always use source from official API + getAgencyServiceAlertsUrlString(context, "T") + ); + final boolean ignoreDirection = isIGNORE_DIRECTION(context); try { GtfsRealtime.FeedMessage gFeedMessage = GtfsRealtime.FeedMessage.parseFrom(response.body().bytes()); List> alertsWithIdPair = GtfsRealtimeExt.toAlertsWithIdPair(gFeedMessage.getEntityList()); - for (Pair gAlertAndId : GtfsRealtimeExt.sortPair(alertsWithIdPair, newLastUpdateInMs)) { + for (Pair gAlertAndId : GtfsRealtimeExt.sortAlertsPair(alertsWithIdPair, newLastUpdateInMs)) { final GtfsRealtime.Alert gAlert = gAlertAndId.getFirst(); final String feedEntityId = gAlertAndId.getSecond(); if (Constants.DEBUG) { MTLog.d(this, "loadAgencyServiceUpdateDataFromWWW() > GTFS alert[%s]: %s.", feedEntityId, GtfsRealtimeExt.toStringExt(gAlert)); } - HashSet alertsServiceUpdates = processAlerts(context, sourceLabel, feedEntityId, newLastUpdateInMs, gAlert); + HashSet alertsServiceUpdates = processAlerts(context, sourceLabel, feedEntityId, newLastUpdateInMs, gAlert, ignoreDirection); if (alertsServiceUpdates != null && !alertsServiceUpdates.isEmpty()) { serviceUpdates.addAll(alertsServiceUpdates); } @@ -865,7 +896,7 @@ private ArrayList loadAgencyServiceUpdateDataFromWWW(@NonNull Con } @Nullable - private String getHashSecretAndDate(@NonNull Context context) { + public String getHashSecretAndDate(@NonNull Context context) { try { final String secret = this.providedAgencyUrlSecret != null ? this.providedAgencyUrlSecret : getAGENCY_URL_SECRET(context); final String date = HASH_DATE_FORMATTER.formatThreadSafe(new Date()); @@ -881,10 +912,15 @@ private String getHashSecretAndDate(@NonNull Context context) { } @Nullable - private HashSet processAlerts(@NonNull Context context, @NonNull String sourceLabel, @Nullable String feedEntityId, long newLastUpdateInMs, GtfsRealtime.Alert gAlert) { - if (gAlert == null) { - return null; - } + private HashSet processAlerts( + @NonNull Context context, + @NonNull String sourceLabel, + @Nullable String feedEntityId, + long newLastUpdateInMs, + GtfsRealtime.Alert gAlert, + boolean ignoreDirection + ) { + if (gAlert == null) return null; java.util.List gInformedEntityList = gAlert.getInformedEntityList(); if (CollectionUtils.getSize(gInformedEntityList) == 0) { MTLog.w(this, "processAlerts() > SKIP (no informed entity selectors!) (%s)", GtfsRealtimeExt.toStringExt(gAlert)); @@ -907,7 +943,7 @@ private HashSet processAlerts(@NonNull Context context, @NonNull MTLog.w(this, "processAlerts() > Alert targets another agency: %s", gInformedEntity.getAgencyId()); continue; } - final String targetUUID = parseProviderTargetUUID(context, agencyTag, gInformedEntity); + final String targetUUID = parseProviderTargetUUID(context, agencyTag, gInformedEntity, ignoreDirection); if (targetUUID == null || targetUUID.isEmpty()) { continue; } @@ -978,12 +1014,10 @@ private static Cleaner getExtraBoldWords(@NonNull Context context, String langua if (!extraBoldWords.containsKey(language)) { try { final int index = getAGENCY_EXTRA_LANGUAGES(context).indexOf(language); - if (index >= 0) { - if (index < getAGENCY_EXTRA_BOLD_WORDS(context).size()) { - final String regex = getAGENCY_EXTRA_BOLD_WORDS(context).get(index); - if (!regex.isEmpty()) { - extraBoldWords.put(language, new Cleaner(regex, true)); - } + if (index >= 0 && index < getAGENCY_EXTRA_BOLD_WORDS(context).size()) { + final String regex = getAGENCY_EXTRA_BOLD_WORDS(context).get(index); + if (!regex.isEmpty()) { + extraBoldWords.put(language, new Cleaner(regex, true)); } } } catch (Exception e) { @@ -1236,9 +1270,9 @@ private Pattern getStopIdCleanupPattern(@NonNull Context context) { } @Nullable - private String parseProviderTargetUUID(@NonNull Context context, String agencyTag, @NonNull GtfsRealtime.EntitySelector gEntitySelector) { + private String parseProviderTargetUUID(@NonNull Context context, String agencyTag, @NonNull GtfsRealtime.EntitySelector gEntitySelector, boolean ignoreDirection) { if (gEntitySelector.hasRouteId()) { - if (gEntitySelector.hasDirectionId()) { + if (gEntitySelector.hasDirectionId() && !ignoreDirection) { if (gEntitySelector.hasStopId()) { return getAgencyRouteDirectionStopTagTargetUUID(agencyTag, GtfsRealtimeExt.getRouteIdHash(gEntitySelector, getRouteIdCleanupPattern(context)), @@ -1426,6 +1460,11 @@ public UriMatcher getURI_MATCHER() { return getURIMATCHER(requireContextCompat()); } + @NonNull + public String getAuthority() { + return getAUTHORITY(requireContextCompat()); + } + @NonNull @Override public Uri getAuthorityUri() { diff --git a/src/main/java/org/mtransit/android/commons/provider/GrandRiverTransitProvider.java b/src/main/java/org/mtransit/android/commons/provider/GrandRiverTransitProvider.java index adcdbcc8..c38e39ab 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GrandRiverTransitProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GrandRiverTransitProvider.java @@ -33,6 +33,10 @@ 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.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; @@ -49,6 +53,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class GrandRiverTransitProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/GreaterSudburyProvider.java b/src/main/java/org/mtransit/android/commons/provider/GreaterSudburyProvider.java index df5fc6d9..b02dd2b5 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GreaterSudburyProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/GreaterSudburyProvider.java @@ -34,6 +34,10 @@ 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.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.SourceUtils; import org.mtransit.commons.provider.GreaterSudburyProviderCommons; @@ -57,6 +61,7 @@ // https://opendata.greatersudbury.ca/datasets/mybus-transit-api // https://dataportal.greatersudbury.ca/swagger/ui/index#/MyBus +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class GreaterSudburyProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt index 7c7ad4b2..230ab652 100644 --- a/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/InstagramNewsProvider.kt @@ -24,6 +24,8 @@ import org.mtransit.android.commons.data.News import org.mtransit.android.commons.provider.InstagramNewsProvider.InstagramApi.JEdgeOwnerToTimelineMediaNode import org.mtransit.android.commons.provider.InstagramNewsProvider.InstagramApi.JProfileUser import org.mtransit.android.commons.provider.agency.AgencyUtils +import org.mtransit.android.commons.provider.news.NewsProvider +import org.mtransit.android.commons.provider.news.NewsProviderContract import retrofit2.Call import retrofit2.create import retrofit2.http.GET @@ -32,6 +34,7 @@ import java.io.IOException import java.util.Locale import java.util.concurrent.TimeUnit +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") class InstagramNewsProvider : NewsProvider() { diff --git a/src/main/java/org/mtransit/android/commons/provider/JCDecauxBikeStationProvider.java b/src/main/java/org/mtransit/android/commons/provider/JCDecauxBikeStationProvider.java index d9026ce4..f8f12332 100644 --- a/src/main/java/org/mtransit/android/commons/provider/JCDecauxBikeStationProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/JCDecauxBikeStationProvider.java @@ -20,6 +20,12 @@ import org.mtransit.android.commons.data.DefaultPOI; import org.mtransit.android.commons.data.POI; import org.mtransit.android.commons.data.POIStatus; +import org.mtransit.android.commons.provider.bike.BikeStationDbHelper; +import org.mtransit.android.commons.provider.bike.BikeStationProvider; +import org.mtransit.android.commons.provider.poi.POIProvider; +import org.mtransit.android.commons.provider.poi.POIProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import java.net.HttpURLConnection; import java.net.SocketException; @@ -31,6 +37,7 @@ import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLHandshakeException; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @Deprecated // use GBFS @SuppressLint("Registered") public class JCDecauxBikeStationProvider extends BikeStationProvider { diff --git a/src/main/java/org/mtransit/android/commons/provider/NextBusProvider.java b/src/main/java/org/mtransit/android/commons/provider/NextBusProvider.java index 3acf8a91..038bbdd1 100644 --- a/src/main/java/org/mtransit/android/commons/provider/NextBusProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/NextBusProvider.java @@ -38,6 +38,13 @@ import org.mtransit.android.commons.data.Stop; import org.mtransit.android.commons.helpers.MTDefaultHandler; import org.mtransit.android.commons.provider.agency.AgencyUtils; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateCleaner; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.Cleaner; import org.mtransit.commons.CollectionUtils; @@ -71,6 +78,7 @@ // https://retro.umoiq.com/xmlFeedDocs/NextBusXMLFeed.pdf // https://retro.umoiq.com/service/publicXMLFeed?command=agencyList // https://retro.umoiq.com/service/publicJSONFeed?command=agencyList +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class NextBusProvider extends MTContentProvider implements ServiceUpdateProviderContract, StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/OCTranspoProvider.java b/src/main/java/org/mtransit/android/commons/provider/OCTranspoProvider.java index 5c3009e7..489936c3 100644 --- a/src/main/java/org/mtransit/android/commons/provider/OCTranspoProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/OCTranspoProvider.java @@ -46,6 +46,13 @@ import org.mtransit.android.commons.provider.OCTranspoProvider.JGetNextTripsForStop.JGetNextTripsForStopResult.JRoute.JRouteDirection; import org.mtransit.android.commons.provider.OCTranspoProvider.JGetNextTripsForStop.JGetNextTripsForStopResult.JRoute.JRouteDirection.JTrips.JTrip; import org.mtransit.android.commons.provider.agency.AgencyUtils; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateCleaner; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.Cleaner; import org.mtransit.commons.CollectionUtils; @@ -86,6 +93,7 @@ // https://www.octranspo.com/en/plan-your-trip/travel-tools/developers/legacy-oc-transpo-api-2.0 // https://octranspo-new.3scale.net/ // "API 2.0 is fully deprecated in Q1, 2025" +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressWarnings({"deprecation", "DeprecatedIsStillUsed"}) @Deprecated @SuppressLint("Registered") diff --git a/src/main/java/org/mtransit/android/commons/provider/OneBusAwayProvider.java b/src/main/java/org/mtransit/android/commons/provider/OneBusAwayProvider.java index 897241c3..20d6ee30 100644 --- a/src/main/java/org/mtransit/android/commons/provider/OneBusAwayProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/OneBusAwayProvider.java @@ -33,6 +33,10 @@ 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.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; import org.mtransit.commons.provider.OneBusAwayProviderCommons; @@ -49,6 +53,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class OneBusAwayProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/RSSNewsProvider.java b/src/main/java/org/mtransit/android/commons/provider/RSSNewsProvider.java index 9b434ba9..e1a428cc 100644 --- a/src/main/java/org/mtransit/android/commons/provider/RSSNewsProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/RSSNewsProvider.java @@ -27,6 +27,7 @@ import org.mtransit.android.commons.UriUtils; import org.mtransit.android.commons.data.News; import org.mtransit.android.commons.helpers.MTDefaultHandler; +import org.mtransit.android.commons.provider.news.NewsProvider; import org.mtransit.android.commons.provider.news.NewsTextFormatter; import org.mtransit.android.commons.provider.news.rss.RssNewProviderUtils; import org.mtransit.commons.CleanUtils; @@ -60,6 +61,7 @@ import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class RSSNewsProvider extends NewsProvider { diff --git a/src/main/java/org/mtransit/android/commons/provider/RTCQuebecProvider.java b/src/main/java/org/mtransit/android/commons/provider/RTCQuebecProvider.java index 19950a2d..93e4b608 100644 --- a/src/main/java/org/mtransit/android/commons/provider/RTCQuebecProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/RTCQuebecProvider.java @@ -40,10 +40,16 @@ import org.mtransit.android.commons.data.ServiceUpdateKtxKt; import org.mtransit.android.commons.data.Stop; import org.mtransit.android.commons.helpers.MTDefaultHandler; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; import org.mtransit.android.commons.provider.news.NewsTextFormatter; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateCleaner; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.Cleaner; import org.mtransit.commons.CollectionUtils; -import org.mtransit.commons.FeatureFlags; import org.mtransit.commons.SourceUtils; import org.mtransit.commons.provider.RTCQuebecProviderCommons; import org.xml.sax.Attributes; @@ -73,6 +79,7 @@ import okhttp3.Request; import okhttp3.Response; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class RTCQuebecProvider extends MTContentProvider implements StatusProviderContract, ServiceUpdateProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/ReginaTransitProvider.java b/src/main/java/org/mtransit/android/commons/provider/ReginaTransitProvider.java index 8d435a3d..3d382381 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ReginaTransitProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/ReginaTransitProvider.java @@ -33,6 +33,10 @@ import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; @@ -51,6 +55,7 @@ import java.util.concurrent.TimeUnit; import java.util.regex.Pattern; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class ReginaTransitProvider extends MTContentProvider implements StatusProviderContract { 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 580f2ec4..c3392aaf 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/StmInfoApiProvider.java @@ -50,6 +50,14 @@ import org.mtransit.android.commons.data.ServiceUpdate; import org.mtransit.android.commons.data.ServiceUpdateKtxKt; import org.mtransit.android.commons.data.Stop; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.gtfs.GTFSRDSProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateCleaner; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.Cleaner; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.SourceUtils; @@ -75,6 +83,7 @@ import okhttp3.Request; import okhttp3.Response; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class StmInfoApiProvider extends MTContentProvider implements StatusProviderContract, ServiceUpdateProviderContract, ProviderInstaller.ProviderInstallListener { diff --git a/src/main/java/org/mtransit/android/commons/provider/StmInfoSubwayProvider.java b/src/main/java/org/mtransit/android/commons/provider/StmInfoSubwayProvider.java index d388b1ac..0ed3ab70 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StmInfoSubwayProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/StmInfoSubwayProvider.java @@ -39,6 +39,10 @@ import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.ServiceUpdate; import org.mtransit.android.commons.data.ServiceUpdateKtxKt; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateCleaner; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProvider; +import org.mtransit.android.commons.provider.serviceupdate.ServiceUpdateProviderContract; import org.mtransit.commons.Cleaner; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.SourceUtils; @@ -65,6 +69,7 @@ import okhttp3.Request; import okhttp3.Response; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class StmInfoSubwayProvider extends MTContentProvider implements ServiceUpdateProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/StrategicMappingProvider.java b/src/main/java/org/mtransit/android/commons/provider/StrategicMappingProvider.java index 0e93b4b4..49ec087a 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StrategicMappingProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/StrategicMappingProvider.java @@ -30,6 +30,10 @@ import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.SourceUtils; import java.net.HttpURLConnection; @@ -44,6 +48,7 @@ import java.util.TimeZone; import java.util.concurrent.TimeUnit; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class StrategicMappingProvider extends MTContentProvider implements StatusProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt index 5777c310..9912cdf5 100644 --- a/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/TwitterNewsProvider.kt @@ -24,6 +24,8 @@ import org.mtransit.android.commons.TimeUtils import org.mtransit.android.commons.UriUtils import org.mtransit.android.commons.data.News import org.mtransit.android.commons.provider.agency.AgencyUtils +import org.mtransit.android.commons.provider.news.NewsProvider +import org.mtransit.android.commons.provider.news.NewsProviderContract import org.mtransit.android.commons.provider.news.NewsTextFormatter import org.mtransit.android.commons.provider.news.twitter.model.Tweet import org.mtransit.android.commons.provider.news.twitter.model.TweetMediaType @@ -39,6 +41,7 @@ import java.util.Date import java.util.Locale import java.util.concurrent.TimeUnit +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") class TwitterNewsProvider : NewsProvider() { diff --git a/src/main/java/org/mtransit/android/commons/provider/WinnipegTransitProvider.java b/src/main/java/org/mtransit/android/commons/provider/WinnipegTransitProvider.java index dc810ee5..d093b7e7 100644 --- a/src/main/java/org/mtransit/android/commons/provider/WinnipegTransitProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/WinnipegTransitProvider.java @@ -39,6 +39,12 @@ import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.news.NewsProvider; +import org.mtransit.android.commons.provider.news.NewsProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CleanUtils; import org.mtransit.commons.SourceUtils; import org.mtransit.commons.provider.WinnipegTransitProviderCommons; @@ -60,6 +66,7 @@ import javax.net.ssl.SSLHandshakeException; +// DO NOT MOVE: referenced in modules AndroidManifest.xml @SuppressLint("Registered") public class WinnipegTransitProvider extends MTContentProvider implements StatusProviderContract, NewsProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt b/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt index 53a5de03..96b3dd02 100644 --- a/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt +++ b/src/main/java/org/mtransit/android/commons/provider/YouTubeNewsProvider.kt @@ -1,5 +1,6 @@ package org.mtransit.android.commons.provider +import android.annotation.SuppressLint import android.content.Context import android.content.UriMatcher import android.net.Uri @@ -20,6 +21,8 @@ import org.mtransit.android.commons.UriUtils import org.mtransit.android.commons.data.News import org.mtransit.android.commons.linkifyAllURLs import org.mtransit.android.commons.provider.agency.AgencyUtils +import org.mtransit.android.commons.provider.news.NewsProvider +import org.mtransit.android.commons.provider.news.NewsProviderContract import org.mtransit.android.commons.provider.news.NewsTextFormatter import org.mtransit.android.commons.provider.news.youtube.YouTubeDateAdapter import org.mtransit.android.commons.provider.news.youtube.YouTubeV3Api @@ -35,6 +38,8 @@ import java.util.concurrent.TimeUnit // https://developers.google.com/youtube/v3 // https://developers.google.com/youtube/v3/docs/channels/list // https://developers.google.com/youtube/v3/docs/playlistItems/list +// DO NOT MOVE: referenced in modules AndroidManifest.xml +@SuppressLint("Registered") class YouTubeNewsProvider : NewsProvider() { companion object { diff --git a/src/main/java/org/mtransit/android/commons/provider/AgencyProvider.java b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/AgencyProvider.java rename to src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java index 1e7468d2..ca55aceb 100644 --- a/src/main/java/org/mtransit/android/commons/provider/AgencyProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.agency; import android.content.Context; import android.content.Intent; @@ -18,6 +18,9 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.data.Area; import org.mtransit.android.commons.data.DataSourceTypeId; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.GTFSProvider; +import org.mtransit.android.commons.provider.common.MTContentProvider; import org.mtransit.commons.FeatureFlags; public abstract class AgencyProvider extends MTContentProvider implements AgencyProviderContract, ProviderInstaller.ProviderInstallListener { diff --git a/src/main/java/org/mtransit/android/commons/provider/AgencyProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProviderContract.java similarity index 87% rename from src/main/java/org/mtransit/android/commons/provider/AgencyProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/agency/AgencyProviderContract.java index 6aee5bae..ae20ce5f 100644 --- a/src/main/java/org/mtransit/android/commons/provider/AgencyProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProviderContract.java @@ -1,4 +1,6 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.agency; + +import org.mtransit.android.commons.provider.common.ProviderContract; public interface AgencyProviderContract extends ProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/AgencyProviderDeployWorker.kt b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProviderDeployWorker.kt similarity index 80% rename from src/main/java/org/mtransit/android/commons/provider/AgencyProviderDeployWorker.kt rename to src/main/java/org/mtransit/android/commons/provider/agency/AgencyProviderDeployWorker.kt index f0517e20..80ce8b78 100644 --- a/src/main/java/org/mtransit/android/commons/provider/AgencyProviderDeployWorker.kt +++ b/src/main/java/org/mtransit/android/commons/provider/agency/AgencyProviderDeployWorker.kt @@ -1,8 +1,7 @@ -package org.mtransit.android.commons.provider +package org.mtransit.android.commons.provider.agency import android.content.Context import android.content.pm.ProviderInfo -import android.database.Cursor import android.net.Uri import androidx.work.Constraints import androidx.work.CoroutineWorker @@ -14,13 +13,13 @@ import kotlinx.coroutines.withContext import org.mtransit.android.commons.MTLog import org.mtransit.android.commons.PackageManagerUtils import org.mtransit.android.commons.R -import org.mtransit.android.commons.SqlUtils import org.mtransit.android.commons.UriUtils class AgencyProviderDeployWorker( private val context: Context, - params: WorkerParameters -) : CoroutineWorker(context, params), MTLog.Loggable { + params: WorkerParameters, +) : CoroutineWorker(context, params), + MTLog.Loggable { companion object { @JvmStatic @@ -34,13 +33,13 @@ class AgencyProviderDeployWorker( ) .build() - val LOG_TAG: String = AgencyProviderDeployWorker::class.java.simpleName + private val LOG_TAG: String = AgencyProviderDeployWorker::class.java.simpleName const val WORK_MANAGER_TAG = "agency_deploy" const val FROM_WORKER = "from_worker" } - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG override suspend fun doWork() = withContext(Dispatchers.IO) { val agencyProviderMetaData = context.getString(R.string.agency_provider) @@ -55,16 +54,15 @@ class AgencyProviderDeployWorker( private fun ping(agencyProvider: ProviderInfo) { val authorityUri = UriUtils.newContentUri(agencyProvider.authority) - var cursor: Cursor? = null try { val pingUri = Uri.withAppendedPath(authorityUri, AgencyProviderContract.PING_PATH) val selection = FROM_WORKER MTLog.i(this, "Ping: ${agencyProvider.authority} ($selection)") - cursor = context.contentResolver.query(pingUri, null, selection, null, null) + context.contentResolver.query(pingUri, null, selection, null, null).use { + // do nothing + } } catch (e: Exception) { MTLog.w(this, e, "Error!") - } finally { - SqlUtils.closeQuietly(cursor) } } } \ No newline at end of file diff --git a/src/main/java/org/mtransit/android/commons/provider/BikeStationDbHelper.java b/src/main/java/org/mtransit/android/commons/provider/bike/BikeStationDbHelper.java similarity index 86% rename from src/main/java/org/mtransit/android/commons/provider/BikeStationDbHelper.java rename to src/main/java/org/mtransit/android/commons/provider/bike/BikeStationDbHelper.java index 9c9a7c2c..cce2e271 100644 --- a/src/main/java/org/mtransit/android/commons/provider/BikeStationDbHelper.java +++ b/src/main/java/org/mtransit/android/commons/provider/bike/BikeStationDbHelper.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.bike; import android.content.Context; import android.database.sqlite.SQLiteDatabase; @@ -8,6 +8,9 @@ import org.mtransit.android.commons.PreferenceUtils; import org.mtransit.android.commons.R; import org.mtransit.android.commons.SqlUtils; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.poi.POIProvider; +import org.mtransit.android.commons.provider.status.StatusProvider; public class BikeStationDbHelper extends MTSQLiteOpenHelper { @@ -27,11 +30,11 @@ public String getLogTag() { /** * Override if multiple {@link BikeStationDbHelper} implementations in same app. */ - static final String PREF_KEY_LAST_UPDATE_MS = "pBikeStationLastUpdate"; + public static final String PREF_KEY_LAST_UPDATE_MS = "pBikeStationLastUpdate"; /** * Override if multiple {@link BikeStationDbHelper} implementations in same app. */ - static final String PREF_KEY_STATUS_LAST_UPDATE_MS = "pBikeStationStatusLastUpdate"; + public static final String PREF_KEY_STATUS_LAST_UPDATE_MS = "pBikeStationStatusLastUpdate"; static final String T_BIKE_STATION = POIProvider.POIDbHelper.T_POI; private static final String T_BIKE_STATION_SQL_CREATE = POIProvider.POIDbHelper.getSqlCreateBuilder(T_BIKE_STATION).build(); diff --git a/src/main/java/org/mtransit/android/commons/provider/BikeStationProvider.java b/src/main/java/org/mtransit/android/commons/provider/bike/BikeStationProvider.java similarity index 94% rename from src/main/java/org/mtransit/android/commons/provider/BikeStationProvider.java rename to src/main/java/org/mtransit/android/commons/provider/bike/BikeStationProvider.java index a9f829b1..7812f980 100644 --- a/src/main/java/org/mtransit/android/commons/provider/BikeStationProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/bike/BikeStationProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.bike; import android.content.ContentValues; import android.content.Context; @@ -30,6 +30,11 @@ import org.mtransit.android.commons.data.DataSourceTypeId; import org.mtransit.android.commons.data.POI; import org.mtransit.android.commons.data.POIStatus; +import org.mtransit.android.commons.provider.agency.AgencyProvider; +import org.mtransit.android.commons.provider.poi.POIProvider; +import org.mtransit.android.commons.provider.poi.POIProviderContract; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import java.util.Locale; import java.util.concurrent.TimeUnit; @@ -108,7 +113,7 @@ private static Uri getAUTHORITYURI(@NonNull Context context) { * Override if multiple {@link BikeStationProvider} implementations in same app. */ @NonNull - static String getDATA_URL(@NonNull Context context) { + public static String getDATA_URL(@NonNull Context context) { if (dataUrl == null) { dataUrl = context.getResources().getString(R.string.bike_station_data_url); } @@ -135,7 +140,7 @@ public static String getTIME_ZONE(@NonNull Context context) { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getValue1Color(@NonNull Context context) { + public static int getValue1Color(@NonNull Context context) { if (value1Color < 0) { value1Color = ContextCompat.getColor(context, R.color.bike_station_value1_color); } @@ -147,7 +152,7 @@ static int getValue1Color(@NonNull Context context) { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getValue1ColorBg(@NonNull Context context) { + public static int getValue1ColorBg(@NonNull Context context) { if (value1ColorBg < 0) { value1ColorBg = ContextCompat.getColor(context, R.color.bike_station_value1_color_bg); } @@ -159,7 +164,7 @@ static int getValue1ColorBg(@NonNull Context context) { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getValue1SubValue1Color(@NonNull Context context) { + public static int getValue1SubValue1Color(@NonNull Context context) { if (value1SubValue1Color < 0) { value1SubValue1Color = ContextCompat.getColor(context, R.color.bike_station_value1_sub_value1_color); } @@ -171,7 +176,7 @@ static int getValue1SubValue1Color(@NonNull Context context) { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getValue1SubValue1ColorBg(@NonNull Context context) { + public static int getValue1SubValue1ColorBg(@NonNull Context context) { if (value1ColorSubValue1Bg < 0) { value1ColorSubValue1Bg = ContextCompat.getColor(context, R.color.bike_station_value1_sub_value1_color_bg); } @@ -183,7 +188,7 @@ static int getValue1SubValue1ColorBg(@NonNull Context context) { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getValue2Color(@NonNull Context context) { + public static int getValue2Color(@NonNull Context context) { if (value2Color < 0) { value2Color = ContextCompat.getColor(context, R.color.bike_station_value2_color); } @@ -195,7 +200,7 @@ static int getValue2Color(@NonNull Context context) { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getValue2ColorBg(@NonNull Context context) { + public static int getValue2ColorBg(@NonNull Context context) { if (value2ColorBg < 0) { value2ColorBg = ContextCompat.getColor(context, R.color.bike_station_value2_color_bg); } @@ -373,7 +378,7 @@ public int deleteMT(@NonNull Uri uri, @Nullable String selection, @Nullable Stri } @SuppressWarnings("UnusedReturnValue") - int deleteAllBikeStationData() { + public int deleteAllBikeStationData() { int affectedRows = 0; try { affectedRows = getWriteDB().delete(BikeStationDbHelper.T_BIKE_STATION, null, null); @@ -384,7 +389,7 @@ int deleteAllBikeStationData() { } @SuppressWarnings("UnusedReturnValue") - int deleteAllBikeStationStatusData() { + public int deleteAllBikeStationStatusData() { int affectedRows = 0; try { affectedRows = getWriteDB().delete(BikeStationDbHelper.T_BIKE_STATION_STATUS, null, null); @@ -561,7 +566,7 @@ public UriMatcher getURI_MATCHER() { /** * Override if multiple {@link BikeStationProvider} implementations in same app. */ - static int getAGENCY_TYPE_ID(@NonNull Context context) { + public static int getAGENCY_TYPE_ID(@NonNull Context context) { if (agencyTypeId < 0) { agencyTypeId = context.getResources().getInteger(R.integer.bike_station_agency_type); } @@ -662,7 +667,7 @@ public ArrayMap getSearchSuggestProjectionMap() { private static final String CLEAN_PARENTHESES_2_REPLACEMENT = "$1)"; @NonNull - static String cleanBikeStationName(@Nullable String name) { + public static String cleanBikeStationName(@Nullable String name) { if (name == null || name.isEmpty()) { return StringUtils.EMPTY; } diff --git a/src/main/java/org/mtransit/android/commons/provider/ContentProviderConstants.java b/src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java similarity index 92% rename from src/main/java/org/mtransit/android/commons/provider/ContentProviderConstants.java rename to src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java index 663271a2..9790167f 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ContentProviderConstants.java +++ b/src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.common; import android.database.Cursor; import android.database.MatrixCursor; @@ -40,5 +40,7 @@ public final class ContentProviderConstants { // public static final int NEWS = 115; // + public static final int VEHICLE_LOCATION = 118; + // public static final int ALL = 999; } diff --git a/src/main/java/org/mtransit/android/commons/provider/MTContentProvider.java b/src/main/java/org/mtransit/android/commons/provider/common/MTContentProvider.java similarity index 98% rename from src/main/java/org/mtransit/android/commons/provider/MTContentProvider.java rename to src/main/java/org/mtransit/android/commons/provider/common/MTContentProvider.java index 2743b428..dd58c628 100644 --- a/src/main/java/org/mtransit/android/commons/provider/MTContentProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/common/MTContentProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.common; import android.content.ContentProvider; import android.content.ContentValues; diff --git a/src/main/java/org/mtransit/android/commons/provider/MTSQLiteOpenHelper.java b/src/main/java/org/mtransit/android/commons/provider/common/MTSQLiteOpenHelper.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/MTSQLiteOpenHelper.java rename to src/main/java/org/mtransit/android/commons/provider/common/MTSQLiteOpenHelper.java index dd22c127..e5a512d7 100644 --- a/src/main/java/org/mtransit/android/commons/provider/MTSQLiteOpenHelper.java +++ b/src/main/java/org/mtransit/android/commons/provider/common/MTSQLiteOpenHelper.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.common; import android.content.Context; import android.database.DatabaseErrorHandler; diff --git a/src/main/java/org/mtransit/android/commons/provider/MTSearchRecentSuggestionsProvider.java b/src/main/java/org/mtransit/android/commons/provider/common/MTSearchRecentSuggestionsProvider.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/MTSearchRecentSuggestionsProvider.java rename to src/main/java/org/mtransit/android/commons/provider/common/MTSearchRecentSuggestionsProvider.java index 8a5cc852..249f16e0 100644 --- a/src/main/java/org/mtransit/android/commons/provider/MTSearchRecentSuggestionsProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/common/MTSearchRecentSuggestionsProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.common; import android.content.ContentValues; import android.content.Context; diff --git a/src/main/java/org/mtransit/android/commons/provider/ProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/common/ProviderContract.java similarity index 92% rename from src/main/java/org/mtransit/android/commons/provider/ProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/common/ProviderContract.java index 91edf835..fda619e7 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/common/ProviderContract.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.common; import android.content.Context; import android.content.UriMatcher; diff --git a/src/main/java/org/mtransit/android/commons/provider/gbfs/data/api/v3/GBFSDateAdapter.kt b/src/main/java/org/mtransit/android/commons/provider/gbfs/data/api/v3/GBFSDateAdapter.kt index a42706e3..2e03aade 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gbfs/data/api/v3/GBFSDateAdapter.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gbfs/data/api/v3/GBFSDateAdapter.kt @@ -23,10 +23,10 @@ import java.util.TimeZone // 2023-07-17T13:34:13+02:00 | yyyy-MM-dd'T'HH:mm:ss:XXX class GBFSDateAdapter : JsonDeserializer, MTLog.Loggable { - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG companion object { - private val LOG_TAG = GBFSDateAdapter::class.java.simpleName + private val LOG_TAG: String = GBFSDateAdapter::class.java.simpleName // ISO 8601 @Deprecated("Not converted to Date anymore") diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSCurrentNextProvider.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSCurrentNextProvider.java similarity index 94% rename from src/main/java/org/mtransit/android/commons/provider/GTFSCurrentNextProvider.java rename to src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSCurrentNextProvider.java index 60136982..33719f58 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSCurrentNextProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSCurrentNextProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.gtfs; import android.content.Context; @@ -9,6 +9,7 @@ import org.mtransit.android.commons.PreferenceUtils; import org.mtransit.android.commons.R; import org.mtransit.android.commons.TimeUtils; +import org.mtransit.android.commons.provider.GTFSProvider; import org.mtransit.android.commons.receiver.DataChange; public class GTFSCurrentNextProvider implements MTLog.Loggable { @@ -106,12 +107,12 @@ private static void setCurrentNextData(@NonNull Context context, @NonNull String PreferenceUtils.savePrefLclAsync(context, PREF_KEY_CURRENT_NEXT_DATA, currentNextData); } - static boolean isNextData(@NonNull Context context) { + public static boolean isNextData(@NonNull Context context) { checkForNextData(context); return CURRENT_NEXT_DATA_NEXT.equals(getCurrentNextData(context)); } - static void checkForNextData(@NonNull Context context) { + public static void checkForNextData(@NonNull Context context) { final String oldCurrentNextData = getCurrentNextData(context); final int now = TimeUtils.currentTimeSec(); boolean isNextData = hasNextData(context) // @@ -151,7 +152,7 @@ static int getLAST_DEPARTURE_IN_SEC(@NonNull Context context) { } } - static int getLAST_LAST_DEPARTURE_IN_SEC(@NonNull Context context) { + public static int getLAST_LAST_DEPARTURE_IN_SEC(@NonNull Context context) { final int nextLastDepartureInSec = getNEXT_LAST_DEPARTURE_IN_SEC(context); if (nextLastDepartureInSec > 0) { return nextLastDepartureInSec; @@ -163,7 +164,7 @@ private static boolean hasNextData(@NonNull Context context) { return getNEXT_FIRST_DEPARTURE_IN_SEC(context) > 0 && getNEXT_LAST_DEPARTURE_IN_SEC(context) > 0; } - static boolean hasCurrentData(@NonNull Context context) { + public static boolean hasCurrentData(@NonNull Context context) { return getCURRENT_FIRST_DEPARTURE_IN_SEC(context) > 0 && getCURRENT_LAST_DEPARTURE_IN_SEC(context) > 0; } } diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSPOIProvider.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSPOIProvider.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/GTFSPOIProvider.java rename to src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSPOIProvider.java index a87b0a93..c481f248 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSPOIProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSPOIProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.gtfs; import android.app.SearchManager; import android.content.Context; @@ -16,6 +16,11 @@ import org.mtransit.android.commons.R; import org.mtransit.android.commons.SqlUtils; import org.mtransit.android.commons.data.POI; +import org.mtransit.android.commons.provider.GTFSProvider; +import org.mtransit.android.commons.provider.GTFSProviderContract; +import org.mtransit.android.commons.provider.common.ProviderContract; +import org.mtransit.android.commons.provider.poi.POIProvider; +import org.mtransit.android.commons.provider.poi.POIProviderContract; import org.mtransit.commons.Constants; import java.util.Map; diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDBHelperUtils.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDBHelperUtils.kt index 23cd237e..b2764acf 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDBHelperUtils.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDBHelperUtils.kt @@ -2,16 +2,17 @@ package org.mtransit.android.commons.provider.gtfs import android.content.Context import android.database.sqlite.SQLiteDatabase +import androidx.core.database.sqlite.transaction import org.mtransit.android.commons.FileUtils import org.mtransit.android.commons.MTLog -import org.mtransit.android.commons.SqlUtils -import org.mtransit.android.commons.provider.GTFSProviderDbHelper import org.mtransit.commons.FeatureFlags import org.mtransit.commons.GTFSCommons +import org.mtransit.commons.sql.SQLUtils import java.io.BufferedReader +import java.io.InputStream import java.io.InputStreamReader -object GTFSProviderDBHelperUtils: MTLog.Loggable { +object GTFSProviderDBHelperUtils : MTLog.Loggable { private val LOG_TAG: String = GTFSProviderDBHelperUtils::class.java.simpleName @@ -29,15 +30,18 @@ object GTFSProviderDBHelperUtils: MTLog.Loggable { sqlInsert: String, sqlDrop: String?, files: IntArray, + sameColumnsCount: Int = 0, + otherColumnsCount: Int = 0, allStrings: Map? = null, stringsColumnIdx: IntArray? = null, addStrings: (Int, String) -> Unit = { _, _ -> }, + openRawResource: (Int) -> InputStream = { context.resources.openRawResource(it) } ) { var tried = 0 var success: Boolean do { try { - success = initDbTable(context, db, table, sqlCreate, sqlInsert, sqlDrop, files, allStrings, stringsColumnIdx, addStrings) + success = db.initDbTable(table, sqlCreate, sqlInsert, sqlDrop, files, allStrings, stringsColumnIdx, addStrings, sameColumnsCount, otherColumnsCount, openRawResource) } catch (e: Exception) { MTLog.w(this, e, "Error while deploying DB table '$table'!") success = false @@ -46,9 +50,7 @@ object GTFSProviderDBHelperUtils: MTLog.Loggable { } while (!success && tried < MAX_DB_INIT_RETRIES) } - private fun initDbTable( - context: Context, - db: SQLiteDatabase, + private fun SQLiteDatabase.initDbTable( table: String, sqlCreate: String?, sqlInsert: String, @@ -57,48 +59,69 @@ object GTFSProviderDBHelperUtils: MTLog.Loggable { allStrings: Map?, stringsColumnIdx: IntArray?, addStrings: (Int, String) -> Unit, + sameColumnsCount: Int, + otherColumnsCount: Int, + openRawResource: (Int) -> InputStream, ): Boolean { try { - db.beginTransaction() - db.execSQL(sqlDrop) // drop if exists - db.execSQL(sqlCreate) // create if not exists - for (file in files) { - try { - context.resources.openRawResource(file).use { inputStream -> - InputStreamReader(inputStream, FileUtils.getUTF8()).use { inputStreamReader -> - BufferedReader(inputStreamReader).forEachLine { - var line = it - if (FeatureFlags.F_EXPORT_STRINGS) { - if (allStrings != null && stringsColumnIdx != null && stringsColumnIdx.isNotEmpty()) { - line = GTFSStringsUtils.replaceLineStrings(line, allStrings, stringsColumnIdx) - } else if (table == GTFSCommons.T_STRINGS) { - GTFSStringsUtils.fromFileLine(line)?.let { (id, string) -> - addStrings(id, string) + transaction { + execSQL(sqlDrop) // drop if exists + execSQL(sqlCreate) // create if not exists + for (file in files) { + try { + openRawResource(file).use { inputStream -> + InputStreamReader(inputStream, FileUtils.getUTF8()).use { inputStreamReader -> + BufferedReader(inputStreamReader).forEachLine { flattenLines -> + flattenLines.toLines(sameColumnsCount, otherColumnsCount).forEach { unflattenLine -> + var line = unflattenLine + if (FeatureFlags.F_EXPORT_STRINGS) { + if (allStrings != null && stringsColumnIdx != null && stringsColumnIdx.isNotEmpty()) { + line = GTFSStringsUtils.replaceLineStrings(line, allStrings, stringsColumnIdx) + } else if (table == GTFSCommons.T_STRINGS) { + GTFSStringsUtils.fromFileLine(line)?.let { (id, string) -> + addStrings(id, string) + } + } + } + val sql = String.format(sqlInsert, line) + try { + execSQL(sql) + } catch (e: Exception) { + MTLog.w( + this, + e, + "ERROR while executing '$sql' on database '${GTFSProviderDbHelper.DB_NAME}' table '$table' file '$file'!" + ) + throw e } } } - val sql = String.format(sqlInsert, line) - try { - db.execSQL(sql) - } catch (e: Exception) { - MTLog.w(this, e, "ERROR while executing '$sql' on database '${GTFSProviderDbHelper.DB_NAME}' table '$table' file '$file'!") - throw e - } } } + } catch (e: Exception) { + MTLog.w(this, e, "ERROR while copying the database '${GTFSProviderDbHelper.DB_NAME}' table '$table' file '$file'!") + return false } - } catch (e: Exception) { - MTLog.w(this, e, "ERROR while copying the database '${GTFSProviderDbHelper.DB_NAME}' table '$table' file '$file'!") - return false } } - db.setTransactionSuccessful() return true } catch (e: Exception) { MTLog.w(this, e, "ERROR while copying the database '${GTFSProviderDbHelper.DB_NAME}' table '$table' file!") return false - } finally { - SqlUtils.endTransactionQuietly(db) } } + + private fun String.toLines(sameColumnsCount: Int, otherColumnsCount: Int): List { + if (sameColumnsCount == 0 || otherColumnsCount == 0) return listOf(this) + return split(SQLUtils.COLUMN_SEPARATOR) + .let { + it.take(sameColumnsCount) to it.drop(sameColumnsCount).chunked(otherColumnsCount) + }.let { (sameColumns, otherColumns) -> + buildList { + otherColumns.forEach { otherColumn -> + add((sameColumns + otherColumn).joinToString(SQLUtils.COLUMN_SEPARATOR)) + } + } + } + } } diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDbHelper.java similarity index 84% rename from src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java rename to src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDbHelper.java index 09a32994..c4af435f 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSProviderDbHelper.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSProviderDbHelper.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.gtfs; import static org.mtransit.android.commons.provider.gtfs.GTFSProviderDBHelperUtils.initDbTableWithRetry; @@ -16,6 +16,8 @@ import org.mtransit.android.commons.R; import org.mtransit.android.commons.SqlUtils; import org.mtransit.android.commons.TimeUtils; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.status.StatusProvider; import org.mtransit.commons.FeatureFlags; import org.mtransit.commons.GTFSCommons; import org.mtransit.commons.sql.SQLUtils; @@ -93,6 +95,17 @@ 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_TRIP = GTFSCommons.T_TRIP; + static final String T_TRIP_K_TRIP_ID_OR_INT = GTFSCommons.getT_TRIP_K_TRIP_ID_OR_INT(); + static final String T_TRIP_K_ROUTE_ID = GTFSCommons.T_TRIP_K_ROUTE_ID; + static final String T_TRIP_K_DIRECTION_ID = GTFSCommons.T_TRIP_K_DIRECTION_ID; + static final String T_TRIP_K_SERVICE_ID_OR_INT = GTFSCommons.getT_TRIP_K_SERVICE_ID_OR_INT(); + private static final int T_TRIP_SAME_COLUMNS_COUNT = GTFSCommons.T_TRIP_SAME_COLUMNS_COUNT; + private static final int T_TRIP_OTHER_COLUMNS_COUNT = GTFSCommons.T_TRIP_OTHER_COLUMNS_COUNT; + private static final String T_TRIP_SQL_CREATE = GTFSCommons.getT_TRIP_SQL_CREATE(); + private static final String T_TRIP_SQL_INSERT = GTFSCommons.getT_TRIP_SQL_INSERT(); + private static final String T_TRIP_SQL_DROP = GTFSCommons.getT_TRIP_SQL_DROP(); + public static final String T_TRIP_IDS = GTFSCommons.T_TRIP_IDS; public static final String T_TRIP_IDS_K_ID = GTFSCommons.T_TRIP_IDS_K_ID; public static final String T_TRIP_IDS_K_ID_INT = GTFSCommons.T_TRIP_IDS_K_ID_INT; @@ -115,6 +128,8 @@ public String getLogTag() { 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 int T_SERVICE_DATES_SAME_COLUMNS_COUNT = GTFSCommons.getT_SERVICE_DATES_SAME_COLUMNS_COUNT(); + private static final int T_SERVICE_DATES_OTHER_COLUMNS_COUNT = GTFSCommons.getT_SERVICE_DATES_OTHER_COLUMNS_COUNT(); private static final String T_SERVICE_DATES_SQL_CREATE = GTFSCommons.getT_SERVICE_DATES_SQL_CREATE(); private static final String T_SERVICE_DATES_SQL_INSERT = GTFSCommons.getT_SERVICE_DATES_SQL_INSERT(); private static final String T_SERVICE_DATES_SQL_DROP = GTFSCommons.getT_SERVICE_DATES_SQL_DROP(); @@ -138,7 +153,7 @@ public static int getDbVersion(@NonNull Context context) { return dbVersion; } - GTFSProviderDbHelper(@NonNull Context context) { + public GTFSProviderDbHelper(@NonNull Context context) { super(context, DB_NAME, null, getDbVersion(context)); this.context = context; } @@ -175,6 +190,7 @@ private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { final int nId = TimeUtils.currentTimeSec(); final long startInMs = TimeUtils.currentTimeMillis(); int nbTotalOperations = 7; + if (FeatureFlags.F_EXPORT_TRIP_ID) nbTotalOperations++; if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) nbTotalOperations++; if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) nbTotalOperations++; int progress = -1; @@ -196,7 +212,7 @@ private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); final Map allStrings = new HashMap<>(); if (FeatureFlags.F_EXPORT_STRINGS || FeatureFlags.F_EXPORT_SCHEDULE_STRINGS) { - initDbTableWithRetry(context, db, T_STRINGS, T_STRINGS_SQL_CREATE, T_STRINGS_SQL_INSERT, T_STRINGS_SQL_DROP, getStringsFiles(), null, null, + initDbTableWithRetry(context, db, T_STRINGS, T_STRINGS_SQL_CREATE, T_STRINGS_SQL_INSERT, T_STRINGS_SQL_DROP, getStringsFiles(), 0, 0, null, null, (id, string) -> { allStrings.put(id, string); return Unit.INSTANCE; @@ -204,19 +220,23 @@ private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { ); // 1st } if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); - initDbTableWithRetry(context, db, T_ROUTE, T_ROUTE_SQL_CREATE, T_ROUTE_SQL_INSERT, T_ROUTE_SQL_DROP, getRouteFiles(), allStrings, T_ROUTE_STRINGS_COLUMN_IDX); + initDbTableWithRetry(context, db, T_ROUTE, T_ROUTE_SQL_CREATE, T_ROUTE_SQL_INSERT, T_ROUTE_SQL_DROP, getRouteFiles(), 0, 0, allStrings, T_ROUTE_STRINGS_COLUMN_IDX); if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); - initDbTableWithRetry(context, db, T_DIRECTION, T_DIRECTION_SQL_CREATE, T_DIRECTION_SQL_INSERT, T_DIRECTION_SQL_DROP, getDirectionFiles(), allStrings, T_DIRECTION_STRINGS_COLUMN_IDX); + initDbTableWithRetry(context, db, T_DIRECTION, T_DIRECTION_SQL_CREATE, T_DIRECTION_SQL_INSERT, T_DIRECTION_SQL_DROP, getDirectionFiles(), 0, 0, allStrings, T_DIRECTION_STRINGS_COLUMN_IDX); if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); - initDbTableWithRetry(context, db, T_STOP, T_STOP_SQL_CREATE, T_STOP_SQL_INSERT, T_STOP_SQL_DROP, getStopFiles(), allStrings, T_STOP_STRINGS_COLUMN_IDX); + initDbTableWithRetry(context, db, T_STOP, T_STOP_SQL_CREATE, T_STOP_SQL_INSERT, T_STOP_SQL_DROP, getStopFiles(), 0, 0, allStrings, T_STOP_STRINGS_COLUMN_IDX); if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); initDbTableWithRetry(context, db, T_DIRECTION_STOPS, T_DIRECTION_STOPS_SQL_CREATE, T_DIRECTION_STOPS_SQL_INSERT, T_DIRECTION_STOPS_SQL_DROP, getDirectionStopsFiles()); - if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); + if (FeatureFlags.F_EXPORT_TRIP_ID) { + if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); + initDbTableWithRetry(context, db, T_TRIP, T_TRIP_SQL_CREATE, T_TRIP_SQL_INSERT, T_TRIP_SQL_DROP, getTripFiles(), T_TRIP_SAME_COLUMNS_COUNT, T_TRIP_OTHER_COLUMNS_COUNT); + } if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); initDbTableWithRetry(context, 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, ++progress); - initDbTableWithRetry(context, db, T_SERVICE_DATES, T_SERVICE_DATES_SQL_CREATE, T_SERVICE_DATES_SQL_INSERT, T_SERVICE_DATES_SQL_DROP, getServiceDatesFiles()); + initDbTableWithRetry(context, db, T_SERVICE_DATES, T_SERVICE_DATES_SQL_CREATE, T_SERVICE_DATES_SQL_INSERT, T_SERVICE_DATES_SQL_DROP, getServiceDatesFiles(), T_SERVICE_DATES_SAME_COLUMNS_COUNT, T_SERVICE_DATES_OTHER_COLUMNS_COUNT); if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) { if (notifEnabled) NotificationUtils.setProgressAndNotify(nm, nb, nId, nbTotalOperations, ++progress); initDbTableWithRetry(context, db, T_TRIP_IDS, T_TRIP_IDS_SQL_CREATE, T_TRIP_IDS_SQL_INSERT, T_TRIP_IDS_SQL_DROP, getTripIdsFiles()); @@ -238,12 +258,27 @@ private void initAllDbTables(@NonNull SQLiteDatabase db, boolean upgrade) { private int[] getTripIdsFiles() { if (GTFSCurrentNextProvider.hasCurrentData(context)) { if (GTFSCurrentNextProvider.isNextData(context)) { - return new int[]{R.raw.next_gtfs_schedule_trip_ids}; + return new int[]{R.raw.next_gtfs_schedule_path_ids}; // do not change to avoid breaking compat w/ old modules + } else { // CURRENT = default + return new int[]{R.raw.current_gtfs_schedule_path_ids}; // do not change to avoid breaking compat w/ old modules + } + } else { + return new int[]{R.raw.gtfs_schedule_path_ids}; // do not change to avoid breaking compat w/ old modules + } + } + + /** + * Override if multiple {@link GTFSProviderDbHelper} in same app. + */ + private int[] getTripFiles() { + if (GTFSCurrentNextProvider.hasCurrentData(context)) { + if (GTFSCurrentNextProvider.isNextData(context)) { + return new int[]{R.raw.next_gtfs_rts_paths}; // do not change to avoid breaking compat w/ old modules } else { // CURRENT = default - return new int[]{R.raw.current_gtfs_schedule_trip_ids}; + return new int[]{R.raw.current_gtfs_rts_paths}; // do not change to avoid breaking compat w/ old modules } } else { - return new int[]{R.raw.gtfs_schedule_trip_ids}; + return new int[]{R.raw.gtfs_rts_paths}; // do not change to avoid breaking compat w/ old modules } } diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java similarity index 74% rename from src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java rename to src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java index 9614c705..0950d623 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSRDSProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.gtfs; import android.content.ContentResolver; import android.content.UriMatcher; @@ -10,13 +10,24 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.collection.ArrayMap; +import androidx.core.util.Pair; import org.mtransit.android.commons.Constants; +import org.mtransit.android.commons.CursorExtKt; import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.SqlUtils; +import org.mtransit.android.commons.provider.GTFSProvider; +import org.mtransit.android.commons.provider.GTFSProviderContract; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.commons.FeatureFlags; import org.mtransit.commons.sql.SQLJoinBuilder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; +import java.util.Map; public class GTFSRDSProvider implements MTLog.Loggable { @@ -28,13 +39,14 @@ public String getLogTag() { return LOG_TAG; } - protected static final int ROUTES = 1; - protected static final int STOPS = 2; - protected static final int DIRECTIONS = 3; - protected static final int ROUTES_DIRECTIONS_STOPS = 4; - protected static final int ROUTES_DIRECTIONS_STOPS_SEARCH = 5; - protected static final int ROUTES_DIRECTIONS = 6; - protected static final int DIRECTIONS_STOPS = 7; + private static final int ROUTES = 1; + private static final int STOPS = 2; + private static final int DIRECTIONS = 3; + private static final int ROUTES_DIRECTIONS_STOPS = 4; + private static final int ROUTES_DIRECTIONS_STOPS_SEARCH = 5; + private static final int ROUTES_DIRECTIONS = 6; + private static final int DIRECTIONS_STOPS = 7; + private static final int TRIPS = 8; public static void append(@NonNull UriMatcher uriMatcher, @NonNull String authority) { uriMatcher.addURI(authority, GTFSProviderContract.ROUTE_PATH, ROUTES); @@ -44,6 +56,7 @@ public static void append(@NonNull UriMatcher uriMatcher, @NonNull String author uriMatcher.addURI(authority, GTFSProviderContract.ROUTE_DIRECTION_STOP_SEARCH_PATH, ROUTES_DIRECTIONS_STOPS_SEARCH); uriMatcher.addURI(authority, GTFSProviderContract.ROUTE_DIRECTION_PATH, ROUTES_DIRECTIONS); uriMatcher.addURI(authority, GTFSProviderContract.DIRECTION_STOP_PATH, DIRECTIONS_STOPS); + uriMatcher.addURI(authority, GTFSProviderContract.TRIP_PATH, TRIPS); } private static final ArrayMap ROUTE_PROJECTION_MAP; @@ -149,12 +162,12 @@ public static void append(@NonNull UriMatcher uriMatcher, @NonNull String author DIRECTION_STOP_PROJECTION_MAP = sb.build(); } - public static final String ROUTE_DIRECTION_DIRECTION_STOPS_STOP_JOIN = SQLJoinBuilder.getNew(GTFSProviderDbHelper.T_STOP) // + static final String ROUTE_DIRECTION_DIRECTION_STOPS_STOP_JOIN = SQLJoinBuilder.getNew(GTFSProviderDbHelper.T_STOP) // .innerJoin(GTFSProviderDbHelper.T_DIRECTION_STOPS, // - GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_ID,// + GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_ID, // GTFSProviderDbHelper.T_DIRECTION_STOPS, GTFSProviderDbHelper.T_DIRECTION_STOPS_K_STOP_ID) // .innerJoin(GTFSProviderDbHelper.T_DIRECTION, // - GTFSProviderDbHelper.T_DIRECTION_STOPS, GTFSProviderDbHelper.T_DIRECTION_STOPS_K_DIRECTION_ID,// + GTFSProviderDbHelper.T_DIRECTION_STOPS, GTFSProviderDbHelper.T_DIRECTION_STOPS_K_DIRECTION_ID, // GTFSProviderDbHelper.T_DIRECTION, GTFSProviderDbHelper.T_DIRECTION_K_ID) // .innerJoin(GTFSProviderDbHelper.T_ROUTE, // GTFSProviderDbHelper.T_DIRECTION, GTFSProviderDbHelper.T_DIRECTION_K_ROUTE_ID, // @@ -170,19 +183,55 @@ public static void append(@NonNull UriMatcher uriMatcher, @NonNull String author private static final String DIRECTION_DIRECTION_STOPS_STOP_JOIN = SQLJoinBuilder.getNew(GTFSProviderDbHelper.T_STOP) // .innerJoin(GTFSProviderDbHelper.T_DIRECTION_STOPS, // - GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_ID,// + GTFSProviderDbHelper.T_STOP, GTFSProviderDbHelper.T_STOP_K_ID, // GTFSProviderDbHelper.T_DIRECTION_STOPS, GTFSProviderDbHelper.T_DIRECTION_STOPS_K_STOP_ID) // .innerJoin(GTFSProviderDbHelper.T_DIRECTION, // - GTFSProviderDbHelper.T_DIRECTION_STOPS, GTFSProviderDbHelper.T_DIRECTION_STOPS_K_DIRECTION_ID,// + GTFSProviderDbHelper.T_DIRECTION_STOPS, GTFSProviderDbHelper.T_DIRECTION_STOPS_K_DIRECTION_ID, // GTFSProviderDbHelper.T_DIRECTION, GTFSProviderDbHelper.T_DIRECTION_K_ID) // .build(); private static final String ROUTE_DIRECTION_JOIN = SQLJoinBuilder.getNew(GTFSProviderDbHelper.T_DIRECTION) // - .innerJoin(GTFSProviderDbHelper.T_ROUTE,// + .innerJoin(GTFSProviderDbHelper.T_ROUTE, // GTFSProviderDbHelper.T_DIRECTION, GTFSProviderDbHelper.T_DIRECTION_K_ROUTE_ID, // GTFSProviderDbHelper.T_ROUTE, GTFSProviderDbHelper.T_ROUTE_K_ID)// .build(); + private static final String TRIP_TRIP_IDS_SERVICE_IDS_JOIN; + + static { + final SQLJoinBuilder bd = SQLJoinBuilder.getNew(GTFSProviderDbHelper.T_TRIP); + if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) { + bd.innerJoin(GTFSProviderDbHelper.T_TRIP_IDS, // + GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT, // + GTFSProviderDbHelper.T_TRIP_IDS, GTFSProviderDbHelper.T_TRIP_IDS_K_ID); + } + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + bd.innerJoin(GTFSProviderDbHelper.T_SERVICE_IDS, // + GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_SERVICE_ID_OR_INT, // + GTFSProviderDbHelper.T_SERVICE_IDS, GTFSProviderDbHelper.T_SERVICE_IDS_K_ID); + } + TRIP_TRIP_IDS_SERVICE_IDS_JOIN = bd.build(); + } + + private static final ArrayMap TRIP_PROJECTION_MAP; + + static { + final SqlUtils.ProjectionMapBuilder sb = SqlUtils.ProjectionMapBuilder.getNew(); + if (FeatureFlags.F_EXPORT_TRIP_ID_INTS) { + sb.appendTableColumn(GTFSProviderDbHelper.T_TRIP_IDS, GTFSProviderDbHelper.T_TRIP_IDS_K_ID, GTFSProviderContract.TripColumns.T_TRIP_K_TRIP_ID); + } else { + sb.appendTableColumn(GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT, GTFSProviderContract.TripColumns.T_TRIP_K_TRIP_ID); + } + sb.appendTableColumn(GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_ROUTE_ID, GTFSProviderContract.TripColumns.T_TRIP_K_ROUTE_ID); + sb.appendTableColumn(GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_DIRECTION_ID, GTFSProviderContract.TripColumns.T_TRIP_K_DIRECTION_ID); + if (FeatureFlags.F_EXPORT_SERVICE_ID_INTS) { + sb.appendTableColumn(GTFSProviderDbHelper.T_SERVICE_IDS, GTFSProviderDbHelper.T_SERVICE_IDS_K_ID, GTFSProviderContract.TripColumns.T_TRIP_K_SERVICE_ID); + } else { + sb.appendTableColumn(GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_SERVICE_ID_OR_INT, GTFSProviderContract.TripColumns.T_TRIP_K_SERVICE_ID); + } + TRIP_PROJECTION_MAP = sb.build(); + } + @Nullable public static Cursor queryS(@NonNull GTFSProvider provider, @NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { try { @@ -217,6 +266,10 @@ public static Cursor queryS(@NonNull GTFSProvider provider, @NonNull Uri uri, @N qb.setTables(DIRECTION_DIRECTION_STOPS_STOP_JOIN); qb.setProjectionMap(DIRECTION_STOP_PROJECTION_MAP); break; + case TRIPS: + qb.setTables(TRIP_TRIP_IDS_SERVICE_IDS_JOIN); + qb.setProjectionMap(TRIP_PROJECTION_MAP); + break; default: return null; // not processed } @@ -255,6 +308,87 @@ private static void appendRouteDirectionStopSearch(Uri uri, SQLiteQueryBuilder q } } + private static final String[] PROJECTION_TRIPS; + + static { + ArrayList list = new ArrayList<>(); + list.add(GTFSProviderDbHelper.T_TRIP_K_ROUTE_ID); + list.add(GTFSProviderDbHelper.T_TRIP_K_DIRECTION_ID); + list.add(GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT); + list.add(GTFSProviderDbHelper.T_TRIP_K_SERVICE_ID_OR_INT); + PROJECTION_TRIPS = list.toArray(new String[0]); + } + + @NonNull + public static HashSet findDirectionTripIdOrIntList(@NonNull GTFSProvider provider, long directionId) { + final HashSet routeTripIdsOrInt = new HashSet<>(); + Cursor cursor = null; + try { + final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + qb.setTables(GTFSProviderDbHelper.T_TRIP); + cursor = qb.query(provider.getReadDB(), + new String[]{GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT}, + SqlUtils.getWhereEquals(GTFSProviderDbHelper.T_TRIP_K_DIRECTION_ID, directionId), + null, + null, + null, + null, + null); + if (cursor != null && cursor.getCount() > 0) { + if (cursor.moveToFirst()) { + do { + final String tripIdOrInt = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT); + if (!TextUtils.isEmpty(tripIdOrInt)) { + routeTripIdsOrInt.add(tripIdOrInt); + } + } while (cursor.moveToNext()); + } + } + } catch (Exception e) { + MTLog.w(LOG_TAG, e, "Error!"); + } finally { + SqlUtils.closeQuietly(cursor); + } + return routeTripIdsOrInt; + } + + /** + * @return should only return 1 route+direction for a trip ID + */ + @NonNull + public static Map> findTripRouteAndDirectionIds(@NonNull GTFSProvider provider, @NonNull Collection tripIdOrInts) { + final Map> tripRouteDirectionIds = new HashMap<>(); + Cursor cursor = null; + try { + final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); + qb.setTables(GTFSProviderDbHelper.T_TRIP); + cursor = qb.query(provider.getReadDB(), + new String[]{GTFSProviderDbHelper.T_TRIP_K_ROUTE_ID, GTFSProviderDbHelper.T_TRIP_K_DIRECTION_ID}, + SqlUtils.getWhereInString(GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT, tripIdOrInts), + null, + null, + null, + null, + null); + if (cursor != null && cursor.getCount() > 0) { + if (cursor.moveToFirst()) { + do { + final String tripIdOrInt = CursorExtKt.getString(cursor, GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT); + final Long routeId = CursorExtKt.getLong(cursor, GTFSProviderDbHelper.T_TRIP_K_ROUTE_ID); + final Long directionId = CursorExtKt.optLong(cursor, GTFSProviderDbHelper.T_TRIP_K_DIRECTION_ID, null); + tripRouteDirectionIds.put(tripIdOrInt, new Pair<>(routeId, directionId)); + } + while (cursor.moveToNext()); + } + } + } catch (Exception e) { + MTLog.w(LOG_TAG, e, "Error!"); + } finally { + SqlUtils.closeQuietly(cursor); + } + return tripRouteDirectionIds; + } + private static final String ROUTE_SORT_ORDER = SqlUtils.getSortOrderAscending(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_ROUTE, GTFSProviderDbHelper.T_ROUTE_K_ID)); private static final String DIRECTION_SORT_ORDER = @@ -264,6 +398,7 @@ private static void appendRouteDirectionStopSearch(Uri uri, SQLiteQueryBuilder q private static final String ROUTE_DIRECTION_STOP_SORT_ORDER = SqlUtils.mergeSortOrder(ROUTE_SORT_ORDER, DIRECTION_SORT_ORDER, STOP_SORT_ORDER); private static final String ROUTE_DIRECTION_SORT_ORDER = SqlUtils.mergeSortOrder(ROUTE_SORT_ORDER, DIRECTION_SORT_ORDER); private static final String DIRECTION_STOP_SORT_ORDER = SqlUtils.mergeSortOrder(DIRECTION_SORT_ORDER, STOP_SORT_ORDER); + private static final String TRIP_SORT_ORDER = SqlUtils.getSortOrderAscending(SqlUtils.getTableColumn(GTFSProviderDbHelper.T_TRIP, GTFSProviderDbHelper.T_TRIP_K_TRIP_ID_OR_INT)); @Nullable public static String getSortOrderS(@NonNull GTFSProvider provider, @NonNull Uri uri) { @@ -281,6 +416,8 @@ public static String getSortOrderS(@NonNull GTFSProvider provider, @NonNull Uri return DIRECTION_STOP_SORT_ORDER; case ROUTES_DIRECTIONS: return ROUTE_DIRECTION_SORT_ORDER; + case TRIPS: + return TRIP_SORT_ORDER; default: return null; // not processed } @@ -288,12 +425,13 @@ public static String getSortOrderS(@NonNull GTFSProvider provider, @NonNull Uri // do not change to avoid breaking changes private static final String ROUTE_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".route"; - private static final String DIRECTION_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".trip"; + private static final String DIRECTION_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".trip"; // do not change to avoid breaking changes private static final String STOP_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".stop"; private static final String ROUTE_DIRECTION_STOP_CONTENT_TYPE = - ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".routetripstop"; - private static final String DIRECTION_STOP_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".tripstop"; - private static final String ROUTE_DIRECTION_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".routetrip"; + ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".routetripstop"; // do not change to avoid breaking changes + private static final String DIRECTION_STOP_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".tripstop"; // do not change to avoid breaking changes + private static final String ROUTE_DIRECTION_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".routetrip"; // do not change to avoid breaking changes + private static final String TRIP_CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE + "/vnd." + Constants.MAIN_APP_PACKAGE_NAME + ".path"; // do not change to avoid breaking changes @Nullable public static String getTypeS(@NonNull GTFSProvider provider, @NonNull Uri uri) { @@ -311,9 +449,10 @@ public static String getTypeS(@NonNull GTFSProvider provider, @NonNull Uri uri) return ROUTE_DIRECTION_CONTENT_TYPE; case DIRECTIONS_STOPS: return DIRECTION_STOP_CONTENT_TYPE; + case TRIPS: + return TRIP_CONTENT_TYPE; default: return null; // not processed } } - } 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 new file mode 100644 index 00000000..428b3e90 --- /dev/null +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRealTimeProviderExt.kt @@ -0,0 +1,40 @@ +package org.mtransit.android.commons.provider.gtfs + +import android.content.Context +import okhttp3.Request +import org.mtransit.android.commons.MTLog +import org.mtransit.android.commons.provider.GTFSRealTimeProvider +import java.net.URL + +fun GTFSRealTimeProvider.makeRequest(context: Context, urlCachedString: String = "", getUrlString: (token: String) -> String): Request? { + if (urlCachedString.isNotBlank()) { + MTLog.i(this, "Loading from cached API (length: %d) '***'...", urlCachedString.length) + return Request.Builder().url(URL(urlCachedString)).build() + } + val token = GTFSRealTimeProvider.getAGENCY_URL_TOKEN(context) // use local token 1st for new/updated API URL & tokens + .takeIf { it.isNotBlank() } ?: this.providedAgencyUrlToken + ?: "" // compat w/ API w/o token + var urlString = getUrlString(token) + if (GTFSRealTimeProvider.isUSE_URL_HASH_SECRET_AND_DATE(context)) { + getHashSecretAndDate(context)?.let { hash -> + urlString = urlString.replace(GTFSRealTimeProvider.MT_HASH_SECRET_AND_DATE.toRegex(), hash.trim()) + } + } + if (urlString.isBlank()) { + MTLog.w(this, "No valid URL!") + return null + } + val url = URL(urlString) + MTLog.i(this, "Loading from '%s'...", url.host) + MTLog.d(this, "Using token '%s' (length: %d)", if (!token.isEmpty()) "***" else "(none)", token.length) + return Request.Builder() + .url(url) + .apply { + val agencyUrlHeaderNames = GTFSRealTimeProvider.getAGENCY_URL_HEADER_NAMES(context) + val agencyUrlHeaderValues = GTFSRealTimeProvider.getAGENCY_URL_HEADER_VALUES(context) + if (agencyUrlHeaderNames.size != agencyUrlHeaderValues.size) return@apply + for (i in agencyUrlHeaderNames.indices) { + addHeader(agencyUrlHeaderNames[i], agencyUrlHeaderValues[i]) + } + }.build() +} diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSScheduleTimestampsProvider.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSScheduleTimestampsProvider.java similarity index 90% rename from src/main/java/org/mtransit/android/commons/provider/GTFSScheduleTimestampsProvider.java rename to src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSScheduleTimestampsProvider.java index 0664e8a2..8e8a7843 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSScheduleTimestampsProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSScheduleTimestampsProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.gtfs; import android.content.Context; import android.content.UriMatcher; @@ -14,9 +14,10 @@ import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; import org.mtransit.android.commons.data.ScheduleTimestamps; +import org.mtransit.android.commons.provider.GTFSProvider; import org.mtransit.android.commons.provider.agency.AgencyUtils; -import org.mtransit.android.commons.provider.gtfs.GTFSStringsUtils; -import org.mtransit.android.commons.provider.gtfs.GTFSTripIdsUtils; +import org.mtransit.android.commons.provider.scheduletimestamp.ScheduleTimestampsProvider; +import org.mtransit.android.commons.provider.scheduletimestamp.ScheduleTimestampsProviderContract; import org.mtransit.commons.FeatureFlags; import java.util.ArrayList; @@ -25,7 +26,7 @@ import java.util.TimeZone; import java.util.concurrent.TimeUnit; -class GTFSScheduleTimestampsProvider implements MTLog.Loggable { +public class GTFSScheduleTimestampsProvider implements MTLog.Loggable { private static final String LOG_TAG = GTFSScheduleTimestampsProvider.class.getSimpleName(); @@ -40,7 +41,7 @@ public static void append(@NonNull UriMatcher uriMatcher, @NonNull String author } @NonNull - static ScheduleTimestamps getScheduleTimestamps(@NonNull GTFSProvider provider, @NonNull ScheduleTimestampsProviderContract.Filter filter) { + public static ScheduleTimestamps getScheduleTimestamps(@NonNull GTFSProvider provider, @NonNull ScheduleTimestampsProviderContract.Filter filter) { ArrayList allTimestamps = new ArrayList<>(); final RouteDirectionStop rds = filter.getRouteDirectionStop(); final long startsAtInMs = filter.getStartsAtInMs(); diff --git a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStatusProvider.java similarity index 96% rename from src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java rename to src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStatusProvider.java index d534666b..9d35e3ff 100644 --- a/src/main/java/org/mtransit/android/commons/provider/GTFSStatusProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStatusProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.gtfs; import android.annotation.SuppressLint; import android.content.Context; @@ -23,9 +23,10 @@ import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.GTFSProvider; import org.mtransit.android.commons.provider.agency.AgencyUtils; -import org.mtransit.android.commons.provider.gtfs.GTFSStringsUtils; -import org.mtransit.android.commons.provider.gtfs.GTFSTripIdsUtils; +import org.mtransit.android.commons.provider.status.StatusProvider; +import org.mtransit.android.commons.provider.status.StatusProviderContract; import org.mtransit.commons.CharUtils; import org.mtransit.commons.FeatureFlags; import org.mtransit.commons.GTFSCommons; @@ -43,7 +44,7 @@ import java.util.TimeZone; import java.util.concurrent.TimeUnit; -class GTFSStatusProvider implements MTLog.Loggable { +public class GTFSStatusProvider implements MTLog.Loggable { private static final String LOG_TAG = GTFSStatusProvider.class.getSimpleName(); @@ -363,8 +364,13 @@ private static String getSTOP_SCHEDULE_RAW_FILE_FORMAT(@NonNull Context context) static { int idx = -1; - GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX = ++idx; // 0 - GTFS_SCHEDULE_STOP_FILE_COL_DIRECTION_IDX = ++idx; // 1 + if (FeatureFlags.F_EXPORT_SCHEDULE_SORTED_BY_ROUTE_DIRECTION) { + GTFS_SCHEDULE_STOP_FILE_COL_DIRECTION_IDX = ++idx; // 0 + GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX = ++idx; // 1 + } else { + GTFS_SCHEDULE_STOP_FILE_COL_SERVICE_IDX = ++idx; // 0 + GTFS_SCHEDULE_STOP_FILE_COL_DIRECTION_IDX = ++idx; // 1 + } // GTFS_SCHEDULE_STOP_FILE_COL_DEPARTURE_IDX = ++idx; // 2 if (FeatureFlags.F_EXPORT_TRIP_ID) { @@ -389,8 +395,8 @@ private static String getSTOP_SCHEDULE_RAW_FILE_FORMAT(@NonNull Context context) @NonNull static Set findScheduleList( @NonNull GTFSProvider provider, - @SuppressWarnings("unused") long routeId, - long directionId, + @SuppressWarnings("unused") long routeId, // included inside direction Id + long directionId, // includes routeId, int stopId, String dateS, String timeS, long diffWithRealityInMs @@ -443,7 +449,7 @@ static Set findScheduleList( continue; } lineDirectionId = Long.parseLong(lineItems[GTFS_SCHEDULE_STOP_FILE_COL_DIRECTION_IDX]); - if (directionId != lineDirectionId) { + if (directionId != lineDirectionId) { // includes route ID continue; } lineDeparture = 0; // 1st departure contains full time "HHMMSS" @@ -759,11 +765,11 @@ public static Integer findLastServiceDate(@NonNull GTFSProvider provider) { @NonNull 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 + GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID_INT, + GTFSProviderDbHelper.T_SERVICE_DATES_K_EXCEPTION_TYPE } : new String[]{ - GTFSCommons.T_SERVICE_DATES_K_SERVICE_ID, - GTFSCommons.T_SERVICE_DATES_K_EXCEPTION_TYPE + GTFSProviderDbHelper.T_SERVICE_DATES_K_SERVICE_ID, + GTFSProviderDbHelper.T_SERVICE_DATES_K_EXCEPTION_TYPE }; @NonNull @@ -771,10 +777,16 @@ private static HashSet> findServicesAndExceptionTypes(@Non final HashSet> serviceIdOrIntAndExceptionTypes = new HashSet<>(); Cursor cursor = null; try { - final String selection = SqlUtils.getWhereEquals(GTFSProviderDbHelper.T_SERVICE_DATES_K_DATE, dateS); final SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(GTFSProviderDbHelper.T_SERVICE_DATES); - cursor = qb.query(provider.getReadDB(), PROJECTION_SERVICE_DATES, selection, null, null, null, null, null); + cursor = qb.query(provider.getReadDB(), + PROJECTION_SERVICE_DATES, + SqlUtils.getWhereEquals(GTFSProviderDbHelper.T_SERVICE_DATES_K_DATE, dateS), + null, + null, + null, + null, + null); if (cursor != null && cursor.getCount() > 0) { if (cursor.moveToFirst()) { do { @@ -826,7 +838,7 @@ public static Cursor queryS(@NonNull GTFSProvider provider, @NonNull Uri uri, @N return StatusProvider.queryS(provider, uri, selection); } - static String getSortOrderS(@NonNull GTFSProvider provider, Uri uri) { + public static String getSortOrderS(@NonNull GTFSProvider provider, Uri uri) { return StatusProvider.getSortOrderS(provider, uri); } diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStringsUtils.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStringsUtils.kt index 6fd35a70..ad32be5c 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStringsUtils.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSStringsUtils.kt @@ -4,7 +4,6 @@ import android.database.Cursor import org.mtransit.android.commons.MTLog import org.mtransit.android.commons.data.Schedule import org.mtransit.android.commons.provider.GTFSProvider -import org.mtransit.android.commons.provider.GTFSProviderDbHelper import org.mtransit.commons.FeatureFlags import org.mtransit.commons.GTFSCommons import org.mtransit.commons.sql.SQLUtils diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSTripIdsUtils.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSTripIdsUtils.kt index 5d1f2feb..76f41560 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSTripIdsUtils.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSTripIdsUtils.kt @@ -4,7 +4,6 @@ import android.database.Cursor import org.mtransit.android.commons.MTLog import org.mtransit.android.commons.data.Schedule import org.mtransit.android.commons.provider.GTFSProvider -import org.mtransit.android.commons.provider.GTFSProviderDbHelper import org.mtransit.commons.FeatureFlags object GTFSTripIdsUtils : MTLog.Loggable { 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 187ea99e..c3a8a4ff 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 @@ -6,6 +6,8 @@ import org.mtransit.android.commons.PreferenceUtils object GtfsRealTimeStorage { + // region Service alerts + /** * Override if multiple {@link GTFSRealTimeDbHelper} implementations in same app. */ @@ -53,4 +55,7 @@ object GtfsRealTimeStorage { fun saveServiceUpdateLanguages(context: Context, languages: Set?) { PreferenceUtils.savePrefLclSync(context, PREF_KEY_SERVICE_UPDATE_LANGUAGES, languages) } + + // endregion + } diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealtimeExt.kt b/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealtimeExt.kt index 6aa4c444..8ec73ff4 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealtimeExt.kt +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GtfsRealtimeExt.kt @@ -8,7 +8,7 @@ import org.mtransit.commons.GTFSCommons import org.mtransit.commons.secToMs import java.util.regex.Pattern -@Suppress("MemberVisibilityCanBePrivate") +@Suppress("MemberVisibilityCanBePrivate", "unused") object GtfsRealtimeExt { private const val MAX_LIST_ITEMS: Int = 5 @@ -31,7 +31,7 @@ object GtfsRealtimeExt { this.filter { it.hasAlert() }.map { it.alert to it.id }.distinctBy { it.first } @JvmStatic - fun List.sort(nowMs: Long = TimeUtils.currentTimeMillis()): List = + fun List.sortAlerts(nowMs: Long = TimeUtils.currentTimeMillis()): List = this.sortedBy { alert -> (alert.getActivePeriod(nowMs)?.startMs() ?: alert.activePeriodList.firstOrNull { it.hasStart() }?.startMs()) @@ -39,7 +39,7 @@ object GtfsRealtimeExt { } @JvmStatic - fun List>.sortPair(nowMs: Long = TimeUtils.currentTimeMillis()): List> = + fun List>.sortAlertsPair(nowMs: Long = TimeUtils.currentTimeMillis()): List> = this.sortedBy { (alert, _) -> (alert.getActivePeriod(nowMs)?.startMs() ?: alert.activePeriodList.firstOrNull { it.hasStart() }?.startMs()) @@ -79,6 +79,10 @@ object GtfsRealtimeExt { fun String.originalIdToHash(idCleanupRegex: Pattern? = null): String = GTFSCommons.stringIdToHash(this, idCleanupRegex).toString() + @JvmStatic + fun String.originalIdToId(idCleanupRegex: Pattern? = null): String = + GTFSCommons.originalIdToId(this, idCleanupRegex) + fun GtfsRealtime.TimeRange.isActive(nowMs: Long = TimeUtils.currentTimeMillis()) = isStarted(nowMs) && !isEnded(nowMs) @@ -99,25 +103,15 @@ object GtfsRealtimeExt { fun GtfsRealtime.Alert.toStringExt(debug: Boolean = Constants.DEBUG) = buildString { append("Alert:") append("{") - append(informedEntityList.toStringExt(short = true, debug)) - append(", ") - append(activePeriodList.toStringExt(short = true, debug)) - append(", ") - append("cause=").append(cause) - if (debug && hasCauseDetail()) { - append("(").append(causeDetail.toStringExt("detail")).append(")") - } - append(", ") - append("effect=").append(effect) - if (debug && hasEffectDetail()) { - append("(").append(effectDetail.toStringExt("detail")).append(")") - } - append(", ") - append(headerText.toStringExt("header", debug)) - append(", ") - append(descriptionText.toStringExt("desc", debug)) - append(", ") - append(url.toStringExt("url", debug)) + append(informedEntityList.toStringExt(short = true, debug)).append(", ") + append(activePeriodList.toStringExt(short = true, debug)).append(", ") + if (hasCause()) append("cause=").append(cause).append(", ") + if (debug && hasCauseDetail()) append("(").append(causeDetail.toStringExt("detail")).append(")").append(",") + if (hasEffect()) append("effect=").append(effect).append(", ") + if (debug && hasEffectDetail()) append("(").append(effectDetail.toStringExt("detail")).append(")").append(", ") + if (hasHeaderText()) append(headerText.toStringExt("header", debug)).append(", ") + if (hasDescriptionText()) append(descriptionText.toStringExt("desc", debug)).append(", ") + if (hasUrl()) append(url.toStringExt("url", debug)).append(", ") append("}") } @@ -170,29 +164,12 @@ object GtfsRealtimeExt { fun GtfsRealtime.EntitySelector.toStringExt(short: Boolean = false) = buildString { append(if (short) "ES:" else "EntitySelector:") append("{") - if (hasAgencyId()) { - append(if (short) "a=" else "agencyId=").append(agencyId) - append("|") - } - if (hasRouteType()) { - append(if (short) "rt=" else "routeType=").append(routeType) - append("|") - } - if (hasRouteId()) { - append(if (short) "r=" else "routeId=").append(routeId) - append("|") - } - if (hasStopId()) { - append(if (short) "s=" else "stopId=").append(stopId) - append("|") - } - if (hasDirectionId()) { - append(if (short) "d=" else "directionId=").append(directionId) - append("|") - } - if (hasTrip()) { - append(trip.toStringExt(short)) - } + if (hasAgencyId()) append(if (short) "a=" else "agencyId=").append(agencyId).append("|") + if (hasRouteType()) append(if (short) "rt=" else "routeType=").append(routeType).append("|") + if (hasRouteId()) append(if (short) "r=" else "routeId=").append(routeId).append("|") + if (hasStopId()) append(if (short) "s=" else "stopId=").append(stopId).append("|") + if (hasDirectionId()) append(if (short) "d=" else "directionId=").append(directionId).append("|") + if (hasTrip()) append(trip.toStringExt(short)) append("}") } @@ -201,25 +178,25 @@ object GtfsRealtimeExt { fun GtfsRealtime.TripDescriptor.toStringExt(short: Boolean = false) = buildString { append(if (short) "TD:" else "TripDescriptor:") append("{") - if (hasTripId()) { - append(if (short) "t=" else "tripId=").append(tripId) - append("|") - } - if (hasDirectionId()) { - append(if (short) "d=" else "directionId=").append(directionId) - append("|") - } - if (hasRouteId()) { - append(if (short) "r=" else "routeId=").append(routeId) - append("|") - } - if (hasStartDate()) { - append(if (short) "sd=" else "startDate=").append(startDate) - append("|") - } - if (hasStartTime()) { - append(if (short) "st=" else "startTime=").append(startTime) - } + if (hasTripId()) append(if (short) "t=" else "tripId=").append(tripId).append("|") + if (hasDirectionId()) append(if (short) "d=" else "directionId=").append(directionId).append("|") + if (hasRouteId()) append(if (short) "r=" else "routeId=").append(routeId).append("|") + if (hasModifiedTrip()) append(modifiedTrip.toStringExt()) + if (hasScheduleRelationship()) append(if (short) "sr=" else "schedRel=").append(scheduleRelationship).append("|") + if (hasStartDate()) append(if (short) "sd=" else "startDate=").append(startDate).append("|") + if (hasStartTime()) append(if (short) "st=" else "startTime=").append(startTime).append("|") + append("}") + } + + @JvmStatic + @JvmOverloads + fun GtfsRealtime.TripDescriptor.ModifiedTripSelector.toStringExt(short: Boolean = false) = buildString { + append(if (short) "MTS:" else "ModifiedTripSelector:") + append("{") + if (hasModificationsId()) append(if (short) "m=" else "modificationsId=").append(modificationsId).append("|") + if (hasAffectedTripId()) append(if (short) "at=" else "affectedTripId=").append(affectedTripId).append("|") + if (hasStartDate()) append(if (short) "sd=" else "startDate=").append(startDate).append("|") + if (hasStartTime()) append(if (short) "st=" else "startTime=").append(startTime).append("|") append("}") } diff --git a/src/main/java/org/mtransit/android/commons/provider/NewsProvider.java b/src/main/java/org/mtransit/android/commons/provider/news/NewsProvider.java similarity index 96% rename from src/main/java/org/mtransit/android/commons/provider/NewsProvider.java rename to src/main/java/org/mtransit/android/commons/provider/news/NewsProvider.java index dfdf96cd..41e5e888 100644 --- a/src/main/java/org/mtransit/android/commons/provider/NewsProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/news/NewsProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.news; import android.annotation.SuppressLint; import android.content.ContentValues; @@ -24,6 +24,9 @@ import org.mtransit.android.commons.StringUtils; import org.mtransit.android.commons.TimeUtils; import org.mtransit.android.commons.data.News; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.sql.SQLCreateBuilder; import org.mtransit.commons.sql.SQLInsertBuilder; @@ -220,7 +223,7 @@ public Cursor getNewsFromDB(@NonNull NewsProviderContract.Filter newsFilter) { private static final String LATEST_NEWS_LIMIT = "100"; @Nullable - static Cursor getDefaultNewsFromDB(@NonNull NewsProviderContract.Filter newsFilter, @NonNull NewsProviderContract provider) { + public static Cursor getDefaultNewsFromDB(@NonNull NewsProviderContract.Filter newsFilter, @NonNull NewsProviderContract provider) { try { String selection = newsFilter.getSqlSelection( NewsProviderContract.Columns.T_NEWS_K_UUID, @@ -273,7 +276,7 @@ public ArrayMap getNewsProjectionMap() { return newsProjectionMap; } - static ArrayMap getNewNewsProjectionMap(String authority) { + public static ArrayMap getNewNewsProjectionMap(String authority) { return SqlUtils.ProjectionMapBuilder.getNew() // .appendValue(SqlUtils.escapeString(authority), Columns.T_NEWS_K_AUTHORITY_META) // .appendTableColumn(NewsDbHelper.T_NEWS, NewsDbHelper.T_NEWS_K_ID, Columns.T_NEWS_K_ID) // @@ -345,7 +348,7 @@ public Uri insertMT(@NonNull Uri uri, @Nullable ContentValues values) { } @SuppressWarnings("UnusedReturnValue") - static synchronized int cacheNewsS(NewsProviderContract provider, ArrayList newNews) { + public static synchronized int cacheNewsS(NewsProviderContract provider, ArrayList newNews) { int affectedRows = 0; SQLiteDatabase db = null; try { @@ -378,7 +381,7 @@ public static void cacheNewsS(@NonNull NewsProviderContract provider, @NonNull N } @Nullable - static ArrayList getCachedNewsS(@NonNull NewsProviderContract provider, @NonNull Filter newFilter) { + public static ArrayList getCachedNewsS(@NonNull NewsProviderContract provider, @NonNull Filter newFilter) { Uri uri = getNewsContentUri(provider); String filterSelection = newFilter.getSqlSelection( NewsProviderContract.Columns.T_NEWS_K_UUID, @@ -423,7 +426,7 @@ private static Uri getNewsContentUri(@NonNull NewsProviderContract provider) { return Uri.withAppendedPath(provider.getAuthorityUri(), NewsProviderContract.NEWS_PATH); } - static boolean deleteCachedNews(@NonNull NewsProviderContract provider, @Nullable Integer newsId) { + public static boolean deleteCachedNews(@NonNull NewsProviderContract provider, @Nullable Integer newsId) { if (newsId == null) { return false; } @@ -437,7 +440,7 @@ static boolean deleteCachedNews(@NonNull NewsProviderContract provider, @Nullabl return deletedRows > 0; } - static boolean purgeUselessCachedNews(@NonNull NewsProviderContract provider) { + public static boolean purgeUselessCachedNews(@NonNull NewsProviderContract provider) { long oldestLastUpdate = TimeUtils.currentTimeMillis() - provider.getNewsMaxValidityInMs(); String selection = SqlUtils.getWhereInferior(NewsProviderContract.Columns.T_NEWS_K_LAST_UPDATE, oldestLastUpdate); int deletedRows = 0; diff --git a/src/main/java/org/mtransit/android/commons/provider/NewsProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/news/NewsProviderContract.java similarity index 99% rename from src/main/java/org/mtransit/android/commons/provider/NewsProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/news/NewsProviderContract.java index 3bd583d2..c26ae2eb 100644 --- a/src/main/java/org/mtransit/android/commons/provider/NewsProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/news/NewsProviderContract.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.news; import android.database.Cursor; import android.net.Uri; @@ -19,6 +19,7 @@ import org.mtransit.android.commons.data.News; import org.mtransit.android.commons.data.POI; import org.mtransit.android.commons.data.RouteDirectionStop; +import org.mtransit.android.commons.provider.common.ProviderContract; import org.mtransit.commons.CollectionUtils; import java.util.ArrayList; diff --git a/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterDateAdapter.kt b/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterDateAdapter.kt index b7eefc0c..82303655 100644 --- a/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterDateAdapter.kt +++ b/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterDateAdapter.kt @@ -27,10 +27,10 @@ class TwitterDateAdapter : JsonSerializer, MTLog.Loggable { - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG companion object { - private val LOG_TAG = TwitterDateAdapter::class.java.simpleName + private val LOG_TAG: String = TwitterDateAdapter::class.java.simpleName // 025-09-02T22:00:01.000Z // (added in v2.3)- diff --git a/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterNewsDbHelper.kt b/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterNewsDbHelper.kt index 75debf72..10a5b5e1 100644 --- a/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterNewsDbHelper.kt +++ b/src/main/java/org/mtransit/android/commons/provider/news/twitter/TwitterNewsDbHelper.kt @@ -5,7 +5,7 @@ import android.database.sqlite.SQLiteDatabase import org.mtransit.android.commons.R import org.mtransit.android.commons.SqlUtils import org.mtransit.android.commons.StringUtils -import org.mtransit.android.commons.provider.NewsProvider.NewsDbHelper +import org.mtransit.android.commons.provider.news.NewsProvider.NewsDbHelper class TwitterNewsDbHelper( val context: Context, diff --git a/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeDateAdapter.kt b/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeDateAdapter.kt index e20dc81e..2ab526fe 100644 --- a/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeDateAdapter.kt +++ b/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeDateAdapter.kt @@ -23,10 +23,10 @@ import java.util.TimeZone class YouTubeDateAdapter : JsonDeserializer, MTLog.Loggable { // TODO JsonSerializer to send start_time - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG companion object { - private val LOG_TAG = YouTubeDateAdapter::class.java.simpleName + private val LOG_TAG: String = YouTubeDateAdapter::class.java.simpleName // 025-09-02T22:00:01.000Z // (added in v2.3)- diff --git a/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeNewsDbHelper.kt b/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeNewsDbHelper.kt index b571c848..bc9a100c 100644 --- a/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeNewsDbHelper.kt +++ b/src/main/java/org/mtransit/android/commons/provider/news/youtube/YouTubeNewsDbHelper.kt @@ -5,9 +5,7 @@ import android.database.sqlite.SQLiteDatabase import org.mtransit.android.commons.R import org.mtransit.android.commons.SqlUtils import org.mtransit.android.commons.StringUtils -import org.mtransit.android.commons.provider.NewsProvider.NewsDbHelper -import org.mtransit.android.commons.provider.NewsProvider.NewsDbHelper.T_NEWS -import org.mtransit.android.commons.provider.NewsProvider.NewsDbHelper.getSqlCreateBuilder +import org.mtransit.android.commons.provider.news.NewsProvider.NewsDbHelper class YouTubeNewsDbHelper( val context: Context, diff --git a/src/main/java/org/mtransit/android/commons/provider/POIProvider.java b/src/main/java/org/mtransit/android/commons/provider/poi/POIProvider.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/POIProvider.java rename to src/main/java/org/mtransit/android/commons/provider/poi/POIProvider.java index eed8eec2..03ae1589 100644 --- a/src/main/java/org/mtransit/android/commons/provider/POIProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/poi/POIProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.poi; import android.annotation.SuppressLint; import android.app.SearchManager; @@ -24,6 +24,10 @@ import org.mtransit.android.commons.StringUtils; import org.mtransit.android.commons.data.DefaultPOI; import org.mtransit.android.commons.data.POI.POIUtils; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; +import org.mtransit.android.commons.provider.common.ProviderContract; import org.mtransit.commons.sql.SQLCreateBuilder; import org.mtransit.commons.sql.SQLInsertBuilder; @@ -389,7 +393,7 @@ public Uri insertMT(@NonNull Uri uri, ContentValues values) { return null; } - protected static synchronized int insertDefaultPOIs(@NonNull POIProviderContract provider, Collection defaultPOIs) { + public static synchronized int insertDefaultPOIs(@NonNull POIProviderContract provider, Collection defaultPOIs) { int affectedRows = 0; SQLiteDatabase db = null; try { diff --git a/src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/poi/POIProviderContract.java similarity index 99% rename from src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/poi/POIProviderContract.java index 69c17294..208580f5 100644 --- a/src/main/java/org/mtransit/android/commons/provider/POIProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/poi/POIProviderContract.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.poi; import android.app.SearchManager; import android.database.Cursor; @@ -18,6 +18,8 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.SqlUtils; import org.mtransit.android.commons.StringUtils; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.common.ProviderContract; import org.mtransit.commons.CollectionUtils; import java.util.ArrayList; diff --git a/src/main/java/org/mtransit/android/commons/provider/ScheduleTimestampsProvider.java b/src/main/java/org/mtransit/android/commons/provider/scheduletimestamp/ScheduleTimestampsProvider.java similarity index 89% rename from src/main/java/org/mtransit/android/commons/provider/ScheduleTimestampsProvider.java rename to src/main/java/org/mtransit/android/commons/provider/scheduletimestamp/ScheduleTimestampsProvider.java index d2b5b3b8..36fed081 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ScheduleTimestampsProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/scheduletimestamp/ScheduleTimestampsProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.scheduletimestamp; import android.content.UriMatcher; import android.database.Cursor; @@ -9,6 +9,9 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.data.ScheduleTimestamps; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.status.StatusProvider; public abstract class ScheduleTimestampsProvider extends MTContentProvider implements ScheduleTimestampsProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/ScheduleTimestampsProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/scheduletimestamp/ScheduleTimestampsProviderContract.java similarity index 96% rename from src/main/java/org/mtransit/android/commons/provider/ScheduleTimestampsProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/scheduletimestamp/ScheduleTimestampsProviderContract.java index 012bd17a..4d459a9b 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ScheduleTimestampsProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/scheduletimestamp/ScheduleTimestampsProviderContract.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.scheduletimestamp; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -8,6 +8,7 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.data.RouteDirectionStop; import org.mtransit.android.commons.data.ScheduleTimestamps; +import org.mtransit.android.commons.provider.common.ProviderContract; public interface ScheduleTimestampsProviderContract extends ProviderContract { diff --git a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateCleaner.kt b/src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateCleaner.kt similarity index 98% rename from src/main/java/org/mtransit/android/commons/provider/ServiceUpdateCleaner.kt rename to src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateCleaner.kt index 7159879a..f68c2b9b 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateCleaner.kt +++ b/src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateCleaner.kt @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider +package org.mtransit.android.commons.provider.serviceupdate import org.mtransit.android.commons.HtmlUtils import org.mtransit.android.commons.LocaleUtils @@ -7,7 +7,6 @@ import org.mtransit.commons.Cleaner import org.mtransit.commons.RegexUtils.groupOr import org.mtransit.commons.RegexUtils.matchGroup import org.mtransit.commons.RegexUtils.maybe -import java.util.Locale @Suppress("MemberVisibilityCanBePrivate", "unused") object ServiceUpdateCleaner { diff --git a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java b/src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateProvider.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java rename to src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateProvider.java index c5770c27..20024ba6 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.serviceupdate; import android.content.Context; import android.content.UriMatcher; @@ -20,6 +20,9 @@ import org.mtransit.android.commons.StringUtils; import org.mtransit.android.commons.TimeUtils; import org.mtransit.android.commons.data.ServiceUpdate; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; import org.mtransit.commons.CollectionUtils; import org.mtransit.commons.sql.SQLCreateBuilder; @@ -218,7 +221,10 @@ public static ArrayList getCachedServiceUpdatesS(@NonNull Service } @Nullable - private static ArrayList getCachedServiceUpdatesS(@NonNull ServiceUpdateProviderContract provider, Uri uri, String selection) { + private static ArrayList getCachedServiceUpdatesS( + @NonNull ServiceUpdateProviderContract provider, + @SuppressWarnings("unused") Uri uri, + String selection) { ArrayList cache = new ArrayList<>(); Cursor cursor = null; try { diff --git a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateProviderContract.java similarity index 97% rename from src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateProviderContract.java index 078e49ee..cb89c3a9 100644 --- a/src/main/java/org/mtransit/android/commons/provider/ServiceUpdateProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/serviceupdate/ServiceUpdateProviderContract.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.serviceupdate; import android.net.Uri; import android.provider.BaseColumns; @@ -16,6 +16,7 @@ import org.mtransit.android.commons.data.Route; import org.mtransit.android.commons.data.RouteDirection; import org.mtransit.android.commons.data.ServiceUpdate; +import org.mtransit.android.commons.provider.common.ProviderContract; import java.util.ArrayList; import java.util.HashMap; @@ -298,12 +299,8 @@ public static Filter fromJSON(@NonNull JSONObject json) { } else { return null; // WTF? } - if (json.has(JSON_CACHE_ONLY)) { - serviceUpdateFilter.cacheOnly = json.getBoolean(JSON_CACHE_ONLY); - } - if (json.has(JSON_IN_FOCUS)) { - serviceUpdateFilter.inFocus = json.getBoolean(JSON_IN_FOCUS); - } + serviceUpdateFilter.cacheOnly = JSONUtils.optBoolean(json, JSON_CACHE_ONLY); + serviceUpdateFilter.inFocus = JSONUtils.optBoolean(json, JSON_IN_FOCUS); if (json.has(JSON_CACHE_VALIDITY_IN_MS)) { serviceUpdateFilter.cacheValidityInMs = json.getLong(JSON_CACHE_VALIDITY_IN_MS); } diff --git a/src/main/java/org/mtransit/android/commons/provider/StatusProvider.java b/src/main/java/org/mtransit/android/commons/provider/status/StatusProvider.java similarity index 98% rename from src/main/java/org/mtransit/android/commons/provider/StatusProvider.java rename to src/main/java/org/mtransit/android/commons/provider/status/StatusProvider.java index c842dfdf..103e7a72 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StatusProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/status/StatusProvider.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.status; import android.content.Context; import android.content.UriMatcher; @@ -21,6 +21,9 @@ import org.mtransit.android.commons.data.POI; import org.mtransit.android.commons.data.POIStatus; import org.mtransit.android.commons.data.Schedule; +import org.mtransit.android.commons.provider.common.ContentProviderConstants; +import org.mtransit.android.commons.provider.common.MTContentProvider; +import org.mtransit.android.commons.provider.common.MTSQLiteOpenHelper; import org.mtransit.commons.sql.SQLCreateBuilder; import java.util.Collection; diff --git a/src/main/java/org/mtransit/android/commons/provider/StatusProviderContract.java b/src/main/java/org/mtransit/android/commons/provider/status/StatusProviderContract.java similarity index 98% rename from src/main/java/org/mtransit/android/commons/provider/StatusProviderContract.java rename to src/main/java/org/mtransit/android/commons/provider/status/StatusProviderContract.java index b22dfe02..7884a049 100644 --- a/src/main/java/org/mtransit/android/commons/provider/StatusProviderContract.java +++ b/src/main/java/org/mtransit/android/commons/provider/status/StatusProviderContract.java @@ -1,4 +1,4 @@ -package org.mtransit.android.commons.provider; +package org.mtransit.android.commons.provider.status; import android.net.Uri; import android.provider.BaseColumns; @@ -12,6 +12,7 @@ import org.mtransit.android.commons.MTLog; import org.mtransit.android.commons.SecureStringUtils; import org.mtransit.android.commons.data.POIStatus; +import org.mtransit.android.commons.provider.common.ProviderContract; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/org/mtransit/android/commons/receiver/GenericReceiver.kt b/src/main/java/org/mtransit/android/commons/receiver/GenericReceiver.kt index a247d122..a62e84e1 100644 --- a/src/main/java/org/mtransit/android/commons/receiver/GenericReceiver.kt +++ b/src/main/java/org/mtransit/android/commons/receiver/GenericReceiver.kt @@ -7,11 +7,13 @@ import org.mtransit.android.commons.MTLog class GenericReceiver : BroadcastReceiver(), MTLog.Loggable { - override fun getLogTag(): String { - return GenericReceiver::class.java.simpleName + companion object { + private val LOG_TAG: String = GenericReceiver::class.java.simpleName } + override fun getLogTag() = LOG_TAG + override fun onReceive(context: Context?, intent: Intent?) { // DO NOTHING } -} \ No newline at end of file +} diff --git a/src/main/java/org/mtransit/android/commons/receiver/ModuleReceiver.kt b/src/main/java/org/mtransit/android/commons/receiver/ModuleReceiver.kt index 70f86d6f..7f37595d 100644 --- a/src/main/java/org/mtransit/android/commons/receiver/ModuleReceiver.kt +++ b/src/main/java/org/mtransit/android/commons/receiver/ModuleReceiver.kt @@ -14,13 +14,16 @@ import org.mtransit.android.commons.R import org.mtransit.android.commons.SqlUtils import org.mtransit.android.commons.UriUtils import org.mtransit.android.commons.data.DataSourceTypeId.isGTFSType -import org.mtransit.android.commons.provider.AgencyProviderContract +import org.mtransit.android.commons.provider.agency.AgencyProviderContract import org.mtransit.android.commons.provider.GTFSProvider import org.mtransit.commons.FeatureFlags class ModuleReceiver : BroadcastReceiver(), MTLog.Loggable { companion object { + + private val LOG_TAG: String = ModuleReceiver::class.java.simpleName + @Suppress("DEPRECATION") private val ACTIONS_PACKAGE = listOf( @@ -50,9 +53,7 @@ class ModuleReceiver : BroadcastReceiver(), MTLog.Loggable { private val ACTIONS_SUPPORTED = ACTIONS_PACKAGE + ACTIONS_MY_PACKAGE } - override fun getLogTag(): String { - return ModuleReceiver::class.java.simpleName - } + override fun getLogTag() = LOG_TAG override fun onReceive(context: Context?, intent: Intent?) { if (context == null) { diff --git a/src/main/java/org/mtransit/android/commons/ui/AppUpdateActivity.kt b/src/main/java/org/mtransit/android/commons/ui/AppUpdateActivity.kt index 8e30f540..18e958ab 100644 --- a/src/main/java/org/mtransit/android/commons/ui/AppUpdateActivity.kt +++ b/src/main/java/org/mtransit/android/commons/ui/AppUpdateActivity.kt @@ -17,7 +17,7 @@ class AppUpdateActivity : Activity(), MTLog.Loggable { companion object { - val LOG_TAG: String = AppUpdateActivity::class.java.simpleName + private val LOG_TAG: String = AppUpdateActivity::class.java.simpleName private const val APP_UPDATE_IN_PROGRESS = "app_update_in_progress" private const val APP_UPDATE_IN_PROGRESS_DEFAULT = false @@ -25,7 +25,7 @@ class AppUpdateActivity : Activity(), val CLASS_NAME: String = AppUpdateActivity::class.java.canonicalName ?: "org.mtransit.android.commons.ui.AppUpdateActivity" } - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG private val progressBar: View by lazy { findViewById(R.id.progress_bar) } diff --git a/src/main/java/org/mtransit/android/commons/ui/InvisibleActivity.kt b/src/main/java/org/mtransit/android/commons/ui/InvisibleActivity.kt index 031e1a3e..22724919 100644 --- a/src/main/java/org/mtransit/android/commons/ui/InvisibleActivity.kt +++ b/src/main/java/org/mtransit/android/commons/ui/InvisibleActivity.kt @@ -12,13 +12,13 @@ class InvisibleActivity : Activity(), MTLog.Loggable { companion object { - val LOG_TAG: String = InvisibleActivity::class.java.simpleName + private val LOG_TAG: String = InvisibleActivity::class.java.simpleName @Suppress("unused") val CLASS_NAME: String = InvisibleActivity::class.java.canonicalName ?: "org.mtransit.android.commons.ui.InvisibleActivity" } - override fun getLogTag(): String = LOG_TAG + override fun getLogTag() = LOG_TAG override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/src/main/java/org/mtransit/android/commons/ui/ModuleRedirectActivity.java b/src/main/java/org/mtransit/android/commons/ui/ModuleRedirectActivity.java index ea03e45d..50c3daba 100644 --- a/src/main/java/org/mtransit/android/commons/ui/ModuleRedirectActivity.java +++ b/src/main/java/org/mtransit/android/commons/ui/ModuleRedirectActivity.java @@ -38,7 +38,7 @@ import org.mtransit.android.commons.TaskUtils; import org.mtransit.android.commons.UriUtils; import org.mtransit.android.commons.data.DataSourceTypeId; -import org.mtransit.android.commons.provider.AgencyProviderContract; +import org.mtransit.android.commons.provider.agency.AgencyProviderContract; import org.mtransit.android.commons.task.MTCancellableAsyncTask; import org.mtransit.commons.FeatureFlags; diff --git a/src/main/res-current/raw/current_gtfs_schedule_trip_ids b/src/main/res-current/raw/current_gtfs_rts_paths similarity index 100% rename from src/main/res-current/raw/current_gtfs_schedule_trip_ids rename to src/main/res-current/raw/current_gtfs_rts_paths diff --git a/src/main/res-next/raw/next_gtfs_schedule_trip_ids b/src/main/res-current/raw/current_gtfs_schedule_path_ids similarity index 100% rename from src/main/res-next/raw/next_gtfs_schedule_trip_ids rename to src/main/res-current/raw/current_gtfs_schedule_path_ids diff --git a/src/main/res/raw/gtfs_schedule_trip_ids b/src/main/res-next/raw/next_gtfs_rts_paths similarity index 100% rename from src/main/res/raw/gtfs_schedule_trip_ids rename to src/main/res-next/raw/next_gtfs_rts_paths diff --git a/src/main/res-next/raw/next_gtfs_schedule_path_ids b/src/main/res-next/raw/next_gtfs_schedule_path_ids new file mode 100644 index 00000000..e69de29b diff --git a/src/main/res/raw/gtfs_rts_paths b/src/main/res/raw/gtfs_rts_paths new file mode 100644 index 00000000..e69de29b diff --git a/src/main/res/raw/gtfs_schedule_path_ids b/src/main/res/raw/gtfs_schedule_path_ids new file mode 100644 index 00000000..e69de29b diff --git a/src/main/res/values/constants.xml b/src/main/res/values/constants.xml index e6d3fb54..b64dfab7 100644 --- a/src/main/res/values/constants.xml +++ b/src/main/res/values/constants.xml @@ -8,6 +8,7 @@ org.mtransit.android.provider.ROUTE_TRIP_STOP_PROVIDER org.mtransit.android.provider.SCHEDULE_PROVIDER + org.mtransit.android.providerSCHEDULE_PROVIDER_TARGET org.mtransit.android.provider.SERVICE_UPDATE_PROVIDER org.mtransit.android.provider.SERVICE_UPDATE_PROVIDER_TARGET diff --git a/src/main/res/values/gtfs_real_time_values.xml b/src/main/res/values/gtfs_real_time_values.xml index 6a1e0da8..9898db30 100755 --- a/src/main/res/values/gtfs_real_time_values.xml +++ b/src/main/res/values/gtfs_real_time_values.xml @@ -4,9 +4,12 @@ -1 + false false + + diff --git a/src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt b/src/test/java/org/mtransit/android/commons/provider/gtfs/GTFSStatusProviderTest.kt similarity index 98% rename from src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt rename to src/test/java/org/mtransit/android/commons/provider/gtfs/GTFSStatusProviderTest.kt index 9e550363..6c779849 100644 --- a/src/test/java/org/mtransit/android/commons/provider/GTFSStatusProviderTest.kt +++ b/src/test/java/org/mtransit/android/commons/provider/gtfs/GTFSStatusProviderTest.kt @@ -1,8 +1,9 @@ -package org.mtransit.android.commons.provider +package org.mtransit.android.commons.provider.gtfs import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test +import org.mtransit.android.commons.provider.gtfs.GTFSStatusProvider import org.mtransit.commons.GTFSCommons import androidx.core.util.Pair as androidXPair From 35318c1450be5f4d9088889234cf966dd7550216 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Thu, 15 Jan 2026 11:45:05 -0500 Subject: [PATCH 2/4] clean --- .../commons/provider/common/ContentProviderConstants.java | 2 -- .../android/commons/provider/gtfs/GTFSRDSProvider.java | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java b/src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java index 9790167f..56a6cc4e 100644 --- a/src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java +++ b/src/main/java/org/mtransit/android/commons/provider/common/ContentProviderConstants.java @@ -40,7 +40,5 @@ public final class ContentProviderConstants { // public static final int NEWS = 115; // - public static final int VEHICLE_LOCATION = 118; - // public static final int ALL = 999; } diff --git a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java index 0950d623..e98b27b6 100644 --- a/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java +++ b/src/main/java/org/mtransit/android/commons/provider/gtfs/GTFSRDSProvider.java @@ -308,6 +308,7 @@ private static void appendRouteDirectionStopSearch(Uri uri, SQLiteQueryBuilder q } } + @SuppressWarnings("unused") private static final String[] PROJECTION_TRIPS; static { @@ -319,6 +320,7 @@ private static void appendRouteDirectionStopSearch(Uri uri, SQLiteQueryBuilder q PROJECTION_TRIPS = list.toArray(new String[0]); } + @SuppressWarnings("unused") @NonNull public static HashSet findDirectionTripIdOrIntList(@NonNull GTFSProvider provider, long directionId) { final HashSet routeTripIdsOrInt = new HashSet<>(); @@ -355,6 +357,7 @@ public static HashSet findDirectionTripIdOrIntList(@NonNull GTFSProvider /** * @return should only return 1 route+direction for a trip ID */ + @SuppressWarnings("unused") @NonNull public static Map> findTripRouteAndDirectionIds(@NonNull GTFSProvider provider, @NonNull Collection tripIdOrInts) { final Map> tripRouteDirectionIds = new HashMap<>(); From c108da14f1937822af5231bf7582b7d311ab9982 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 16 Jan 2026 08:29:21 -0500 Subject: [PATCH 3/4] Update pub/generate_all_dpis_from_xxxhdpi.sh Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- pub/generate_all_dpis_from_xxxhdpi.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pub/generate_all_dpis_from_xxxhdpi.sh b/pub/generate_all_dpis_from_xxxhdpi.sh index 225e0dbc..558471a2 100755 --- a/pub/generate_all_dpis_from_xxxhdpi.sh +++ b/pub/generate_all_dpis_from_xxxhdpi.sh @@ -39,6 +39,10 @@ if [ "$RES_DIR_NAME" != "res" ]; then exit 1 #error fi +mkdir -p "$RES_DIR/drawable-xxhdpi" +mkdir -p "$RES_DIR/drawable-xhdpi" +mkdir -p "$RES_DIR/drawable-hdpi" +mkdir -p "$RES_DIR/drawable-mdpi" convert $SOURCE -resize 75% $RES_DIR/drawable-xxhdpi/$SOURCE_NAME convert $SOURCE -resize 50% $RES_DIR/drawable-xhdpi/$SOURCE_NAME convert $SOURCE -resize 37.5% $RES_DIR/drawable-hdpi/$SOURCE_NAME From 2d7939a03119053e0a1a8ca7b704b1ce5257b4e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathieu=20M=C3=A9a?= Date: Fri, 16 Jan 2026 08:32:25 -0500 Subject: [PATCH 4/4] PR comments --- pub/generate_all_dpis_from_xxxhdpi.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pub/generate_all_dpis_from_xxxhdpi.sh b/pub/generate_all_dpis_from_xxxhdpi.sh index 558471a2..1b34a8ce 100755 --- a/pub/generate_all_dpis_from_xxxhdpi.sh +++ b/pub/generate_all_dpis_from_xxxhdpi.sh @@ -9,7 +9,7 @@ fi SOURCE=$1 echo "SOURCE: $SOURCE." -if [ ! -f "$SOURCE" ]; then +if [[ ! -f "$SOURCE" ]]; then echo "> File '$SOURCE' does not exist!" exit 1 #error fi @@ -23,7 +23,7 @@ echo "SOURCE_NAME: $SOURCE_NAME." SOURCE_DIR_NAME=$(basename "$SOURCE_DIR") echo "SOURCE_DIR_NAME: $SOURCE_DIR_NAME." -if [ "$SOURCE_DIR_NAME" != "drawable-xxxhdpi" ]; then +if [[ "$SOURCE_DIR_NAME" != "drawable-xxxhdpi" ]]; then echo "> Wrong source drawable DPI '$SOURCE_DIR_NAME'!" exit 1 #error fi @@ -34,18 +34,20 @@ echo "RES_DIR: $RES_DIR." RES_DIR_NAME=$(basename "$RES_DIR") echo "RES_DIR_NAME: $RES_DIR_NAME." -if [ "$RES_DIR_NAME" != "res" ]; then +if [[ "$RES_DIR_NAME" != "res" ]]; then echo "> Wrong source resource directory '$RES_DIR_NAME'!" exit 1 #error fi +convert -version &> /dev/null || (sudo apt-get update && sudo apt-get install -y imagemagick); + mkdir -p "$RES_DIR/drawable-xxhdpi" -mkdir -p "$RES_DIR/drawable-xhdpi" -mkdir -p "$RES_DIR/drawable-hdpi" -mkdir -p "$RES_DIR/drawable-mdpi" convert $SOURCE -resize 75% $RES_DIR/drawable-xxhdpi/$SOURCE_NAME +mkdir -p "$RES_DIR/drawable-xhdpi" convert $SOURCE -resize 50% $RES_DIR/drawable-xhdpi/$SOURCE_NAME +mkdir -p "$RES_DIR/drawable-hdpi" convert $SOURCE -resize 37.5% $RES_DIR/drawable-hdpi/$SOURCE_NAME +mkdir -p "$RES_DIR/drawable-mdpi" convert $SOURCE -resize 25% $RES_DIR/drawable-mdpi/$SOURCE_NAME echo "Done"