diff --git a/pub/generate_all_dpis_from_xxxhdpi.sh b/pub/generate_all_dpis_from_xxxhdpi.sh
new file mode 100755
index 00000000..1b34a8ce
--- /dev/null
+++ b/pub/generate_all_dpis_from_xxxhdpi.sh
@@ -0,0 +1,54 @@
+#!/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 -version &> /dev/null || (sudo apt-get update && sudo apt-get install -y imagemagick);
+
+mkdir -p "$RES_DIR/drawable-xxhdpi"
+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"
+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 95%
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..56a6cc4e 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;
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..e98b27b6 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,90 @@ private static void appendRouteDirectionStopSearch(Uri uri, SQLiteQueryBuilder q
}
}
+ @SuppressWarnings("unused")
+ 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]);
+ }
+
+ @SuppressWarnings("unused")
+ @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
+ */
+ @SuppressWarnings("unused")
+ @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 +401,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 +419,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 +428,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 +452,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