Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
fa37b8e
Vehicles locations
mmathieum Dec 1, 2025
9fbd492
wip & cleanup
mmathieum Dec 2, 2025
b7fec2a
wip
mmathieum Dec 2, 2025
ac994e3
wip
mmathieum Dec 4, 2025
4da8657
wip
mmathieum Dec 5, 2025
7585dcf
wip
mmathieum Dec 5, 2025
2ee62df
wip
mmathieum Dec 5, 2025
8b6e37d
wip
mmathieum Dec 5, 2025
cc16b2e
wip
mmathieum Dec 5, 2025
9ab0288
wip
mmathieum Dec 5, 2025
643c8cb
fix
mmathieum Dec 8, 2025
53fc96c
Merge branch 'master' into mm/vehicle
mmathieum Jan 5, 2026
89c38f9
Filter with trip IDs
mmathieum Jan 5, 2026
0f0f8c3
sched relationship
mmathieum Jan 5, 2026
922d9a7
cleanup
mmathieum Jan 5, 2026
72c6e69
fix
mmathieum Jan 5, 2026
0345f75
add vehicle location reporting timestamp
mmathieum Jan 6, 2026
890013c
fix & sh
mmathieum Jan 8, 2026
c5620aa
fix report timestamp unit mess
mmathieum Jan 8, 2026
49c0e56
fix in focus
mmathieum Jan 8, 2026
9c52afd
Tweak validity & add authority
mmathieum Jan 9, 2026
5139c6c
validity in focus > 10 sec (remote config from main app)
mmathieum Jan 12, 2026
7df4601
fix tripIdCleanupPattern
mmathieum Jan 12, 2026
4e01416
Compat w/ headers (name=value) in GTFS-RT & ignore direction #STM
mmathieum Jan 13, 2026
b9f08d8
rename
mmathieum Jan 14, 2026
33eac0c
logs++
mmathieum Jan 14, 2026
d0dc15c
Merge branch 'master' into mm/vehicle
mmathieum Jan 16, 2026
9c69091
GTFS Vehicle cached URL validity *=2 & Direction += authority
mmathieum Jan 19, 2026
d10b566
PR comments :love:
mmathieum Jan 19, 2026
138e3a5
NextBus compat...
mmathieum Jan 21, 2026
57bfd7c
PR comments
mmathieum Jan 22, 2026
b28d0ee
VL > fix units
mmathieum Jan 22, 2026
b57c626
compat with export trip id still OFF
mmathieum Jan 22, 2026
b55d22f
clean
mmathieum Jan 23, 2026
2e4931e
clean
mmathieum Jan 23, 2026
e32179a
fix
mmathieum Jan 23, 2026
a199175
Merge remote-tracking branch 'origin/master' into mm/vehicle
mmathieum Jan 23, 2026
2031336
merge
mmathieum Jan 23, 2026
e6f9dea
Merge branch 'master' into mm/vehicle
mmathieum Jan 26, 2026
4786006
minor
mmathieum Jan 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/debug/res/values/constants.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<string name="schedule_provider">org.mtransit.android.debug.provider.SCHEDULE_PROVIDER</string>
<!-- org.mtransit.android.debug.provider.SCHEDULE_PROVIDER_TARGET (do not fix to avoid breaking change) -->
<string name="schedule_provider_target">org.mtransit.android.debug.providerSCHEDULE_PROVIDER_TARGET</string>
<string name="vehicle_location_provider">org.mtransit.android.debug.provider.VEHICLE_LOCATION_PROVIDER</string>
<string name="vehicle_location_provider_target">org.mtransit.android.debug.provider.VEHICLE_LOCATION_PROVIDER_TARGET</string>
<string name="service_update_provider">org.mtransit.android.debug.provider.SERVICE_UPDATE_PROVIDER</string>
<string name="service_update_provider_target">org.mtransit.android.debug.provider.SERVICE_UPDATE_PROVIDER_TARGET</string>
<string name="news_provider">org.mtransit.android.debug.provider.NEWS_PROVIDER</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,10 +94,9 @@ public static String getPREFS_LCL_AGENCY_TYPE_TAB_AGENCY(int typeId) {
}

private static final String PREFS_LCL_AGENCY_LAST_OPENED = "pAgencyLastOpened";
public static final long PREFS_LCL_AGENCY_LAST_OPENED_DEFAULT = -1L;

@NonNull
public static String getPREFS_LCL_AGENCY_LAST_OPENED_DEFAULT(String authority) {
public static String getPREFS_LCL_AGENCY_LAST_OPENED_DEFAULT(@NonNull String authority) {
return PREFS_LCL_AGENCY_LAST_OPENED + authority;
}

Expand Down
34 changes: 24 additions & 10 deletions src/main/java/org/mtransit/android/commons/data/Direction.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import java.util.Comparator;

@SuppressWarnings("WeakerAccess")
public class Direction {
public class Direction implements Targetable {

private static final String LOG_TAG = Direction.class.getSimpleName();

Expand All @@ -41,26 +41,32 @@ public class Direction {
public static final int HEADSIGN_TYPE_STOP_ID = 3;
public static final int HEADSIGN_TYPE_NO_PICKUP = 4;

@NonNull
private final String authority;
private final long id;
@HeadSignType
private final int headsignType;
@NonNull
private final String headsignValue;
private final long routeId;

public Direction(long id,
@HeadSignType int headsignType,
@NonNull String headsignValue,
long routeId) {
public Direction(
@NonNull String authority,
long id,
@HeadSignType int headsignType,
@NonNull String headsignValue,
long routeId) {
this.authority = authority;
this.id = id;
this.headsignType = headsignType;
this.headsignValue = headsignValue;
this.routeId = routeId;
}

@NonNull
public static Direction fromCursor(@NonNull Cursor c) {
public static Direction fromCursor(@NonNull Cursor c, @NonNull String authority) {
return new Direction(
authority,
CursorExtKt.getLong(c, GTFSProviderContract.DirectionColumns.T_DIRECTION_K_ID),
CursorExtKt.getInt(c, GTFSProviderContract.DirectionColumns.T_DIRECTION_K_HEADSIGN_TYPE),
CursorExtKt.getString(c, GTFSProviderContract.DirectionColumns.T_DIRECTION_K_HEADSIGN_VALUE),
Expand All @@ -72,7 +78,8 @@ public static Direction fromCursor(@NonNull Cursor c) {
@Override
public String toString() {
return Direction.class.getSimpleName() + "{" +
"id=" + id +
"authority='" + authority + '\'' +
", id=" + id +
", headsignType=" + headsignType +
", headsignValue='" + headsignValue + '\'' +
", routeId=" + routeId +
Expand Down Expand Up @@ -100,9 +107,10 @@ public static JSONObject toJSON(@NonNull Direction direction) {
}

@NonNull
public static Direction fromJSON(@NonNull JSONObject jDirection) throws JSONException {
public static Direction fromJSON(@NonNull JSONObject jDirection, @NonNull String authority) throws JSONException {
try {
return new Direction(
authority,
jDirection.getLong(JSON_ID),
jDirection.getInt(JSON_HEADSIGN_TYPE),
jDirection.getString(JSON_HEADSIGN_VALUE),
Expand Down Expand Up @@ -220,8 +228,14 @@ public static boolean isSameHeadsign(@Nullable String stringHeadsign1, @Nullable
}

@NonNull
public String getUUID(@NonNull String authority) {
return POI.POIUtils.getUUID(authority, this.routeId, this.id);
public String getAuthority() {
return this.authority;
}

@NonNull
@Override
public String getUUID() {
return POI.POIUtils.getUUID(this.authority, this.routeId, this.id);
}

public long getId() {
Expand Down
5 changes: 1 addition & 4 deletions src/main/java/org/mtransit/android/commons/data/POI.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

import java.lang.annotation.Retention;

public interface POI extends MTLog.Loggable {
public interface POI extends Targetable, MTLog.Loggable {

@Retention(SOURCE)
@IntDef({ITEM_VIEW_TYPE_ROUTE_DIRECTION_STOP, ITEM_VIEW_TYPE_BASIC_POI, ITEM_VIEW_TYPE_MODULE, ITEM_VIEW_TYPE_TEXT_MESSAGE, ITEM_VIEW_TYPE_PLACE})
Expand Down Expand Up @@ -71,9 +71,6 @@ public interface POI extends MTLog.Loggable {

boolean hasLocation();

@NonNull
String getUUID();

@NonNull
String getAuthority();

Expand Down
4 changes: 3 additions & 1 deletion src/main/java/org/mtransit/android/commons/data/Route.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Route implements MTLog.Loggable {
public class Route implements Targetable, MTLog.Loggable {

private static final String LOG_TAG = Route.class.getSimpleName();

Expand Down Expand Up @@ -210,6 +210,7 @@ public long getId() {
private String uuid = null;

@NonNull
@Override
public String getUUID() {
if (this.uuid == null) {
this.uuid = POI.POIUtils.getUUID(this.authority, this.id);
Expand All @@ -221,6 +222,7 @@ public void resetUUID() {
this.uuid = null;
}

@SuppressWarnings("unused") // main app only
@NonNull
public Collection<String> getAllUUIDs() {
return Arrays.asList(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import java.util.Arrays;
import java.util.Collection;

public class RouteDirection implements MTLog.Loggable {
public class RouteDirection implements Targetable, MTLog.Loggable {

private static final String LOG_TAG = RouteDirection.class.getSimpleName();

Expand All @@ -40,10 +40,12 @@ public RouteDirection(
}

@NonNull
@Override
public String getUUID() {
return direction.getUUID(getAuthority());
return direction.getUUID();
}

@SuppressWarnings("unused") // main app only
@NonNull
public Collection<String> getAllUUIDs() {
return Arrays.asList(
Expand Down Expand Up @@ -109,7 +111,7 @@ public static RouteDirection fromJSON(@NonNull JSONObject json, @NonNull String
try {
return new RouteDirection(
Route.fromJSON(json.getJSONObject(JSON_ROUTE), authority),
Direction.fromJSON(json.getJSONObject(JSON_DIRECTION))
Direction.fromJSON(json.getJSONObject(JSON_DIRECTION), authority)
);
} catch (JSONException jsone) {
MTLog.w(LOG_TAG, jsone, "Error while parsing JSON '%s'!", json);
Expand Down Expand Up @@ -153,6 +155,7 @@ public static RouteDirection fromCursorStatic(@NonNull Cursor c, @NonNull String
CursorExtKt.optInt(c, GTFSProviderContract.RouteDirectionColumns.T_ROUTE_K_TYPE, GTFSCommons.DEFAULT_ROUTE_TYPE)
),
new Direction(
authority,
CursorExtKt.getLong(c, GTFSProviderContract.RouteDirectionColumns.T_DIRECTION_K_ID),
CursorExtKt.getInt(c, GTFSProviderContract.RouteDirectionColumns.T_DIRECTION_K_HEADSIGN_TYPE),
CursorExtKt.getString(c, GTFSProviderContract.RouteDirectionColumns.T_DIRECTION_K_HEADSIGN_VALUE),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,12 @@ public RouteDirectionStop(
}

public RouteDirectionStop(
@DataSourceType int dataSourceTypeId,
@NonNull Route route,
@NonNull Direction direction,
@NonNull Stop stop,
boolean noPickup) {
@DataSourceType int dataSourceTypeId,
@NonNull Route route,
@NonNull Direction direction,
@NonNull Stop stop,
boolean noPickup
) {
super(route.getAuthority(), -1, dataSourceTypeId, POI.ITEM_VIEW_TYPE_ROUTE_DIRECTION_STOP, POI.ITEM_STATUS_TYPE_SCHEDULE, POI.ITEM_ACTION_TYPE_ROUTE_DIRECTION_STOP);
this.route = route;
this.direction = direction;
Expand All @@ -82,11 +83,16 @@ public int getId() {
@Override
public String getUUID() {
if (this.uuid == null) {
this.uuid = POI.POIUtils.getUUID(getAuthority(), getRoute().getId(), getDirection().getId(), getStop().getId());
this.uuid = makeUUID(getAuthority(), getRoute().getId(), getDirection().getId(), getStop().getId());
}
return this.uuid;
}

@NonNull
public static String makeUUID(@NonNull String authority, long routeId, long directionId, int stopId) {
return POI.POIUtils.getUUID(authority, routeId, directionId, stopId);
}

@Override
public void resetUUID() {
this.uuid = null;
Expand Down Expand Up @@ -201,7 +207,7 @@ public static RouteDirectionStop fromJSONStatic(@NonNull JSONObject json) {
final RouteDirectionStop rds = new RouteDirectionStop( //
DefaultPOI.getDSTypeIdFromJSON(json),//
Route.fromJSON(json.getJSONObject(JSON_ROUTE), authority), //
Direction.fromJSON(json.getJSONObject(JSON_DIRECTION)), //
Direction.fromJSON(json.getJSONObject(JSON_DIRECTION), authority), //
Stop.fromJSON(json.getJSONObject(JSON_STOP)), //
json.getBoolean(JSON_NO_PICKUP) //
);
Expand Down Expand Up @@ -261,6 +267,7 @@ public static RouteDirectionStop fromCursorStatic(@NonNull Cursor c, @NonNull St
CursorExtKt.optInt(c, GTFSProviderContract.RouteDirectionStopColumns.T_ROUTE_K_TYPE, GTFSCommons.DEFAULT_ROUTE_TYPE)
),
new Direction(
authority,
CursorExtKt.getLong(c, GTFSProviderContract.RouteDirectionStopColumns.T_DIRECTION_K_ID),
CursorExtKt.getInt(c, GTFSProviderContract.RouteDirectionStopColumns.T_DIRECTION_K_HEADSIGN_TYPE),
CursorExtKt.getString(c, GTFSProviderContract.RouteDirectionStopColumns.T_DIRECTION_K_HEADSIGN_VALUE),
Expand Down Expand Up @@ -308,9 +315,10 @@ public Direction getDirection() {

@NonNull
public String getRouteDirectionUUID() {
return direction.getUUID(getAuthority());
return direction.getUUID();
}

@SuppressWarnings("unused") // main app only
@NonNull
public Collection<String> getRouteDirectionAllUUIDs() {
return Arrays.asList(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ fun Iterable<ServiceUpdate>?.isSeverityWarningInfo(): Pair<Boolean, Boolean> {
fun Iterable<ServiceUpdate>.distinctByOriginalId() =
this.distinctBy { it.originalId ?: it.id } // keep 1st occurrence from sorted list (in *Manager)

fun ServiceUpdateProviderContract.makeServiceUpdateNoneList(targetUUID: String, sourceId: String): ArrayList<ServiceUpdate> =
fun ServiceUpdateProviderContract.makeServiceUpdateNoneList(targetable: Targetable, sourceId: String): ArrayList<ServiceUpdate> =
ArrayList<ServiceUpdate>().apply {
add(makeServiceUpdateNone(targetUUID, sourceId))
add(makeServiceUpdateNone(targetable.uuid, sourceId))
}

fun ServiceUpdateProviderContract.makeServiceUpdateNone(targetUUID: String, sourceId: String): ServiceUpdate {
return ServiceUpdate(
fun ServiceUpdateProviderContract.makeServiceUpdateNone(targetUUID: String, sourceId: String) =
ServiceUpdate(
null,
targetUUID,
TimeUtils.currentTimeMillis(),
Expand All @@ -43,4 +43,3 @@ fun ServiceUpdateProviderContract.makeServiceUpdateNone(targetUUID: String, sour
null,
getServiceUpdateLanguage(),
)
}
8 changes: 8 additions & 0 deletions src/main/java/org/mtransit/android/commons/data/Targetable.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.mtransit.android.commons.data

interface Targetable {

val uUID: String
val uuid: String get() = this.uUID

}
Loading