Refresh the Flutter snapshot: v3 tickets V3-04 through V3-16, plus a fresh installable APK

V3-04 through V3-07, V3-10, V3-16 shipped complete; V3-11/V3-12/V3-14 shipped code-complete pending device/account verification; V3-08/V3-09 deferred behind a new V3-17 (self-hosted OSRM investigation). 316 tests passing, up from 221.

The APK is a fresh release build (debug-signed, no release signing config exists yet) with two build fixes applied: core library desugaring enabled for flutter_local_notifications, and sentry_flutter bumped to 9.27.0 (8.14.2's bundled Kotlin plugin was incompatible with this project's Kotlin 2.4.0 toolchain).
This commit is contained in:
2026-08-19 13:36:04 -05:00
parent 14289befb0
commit 4c634354bd
48 changed files with 4436 additions and 224 deletions

View File

@@ -141,6 +141,33 @@ void main() {
expect(doc.findAllElements('trkpt').length, 1,
reason: 'no point may be silently dropped');
});
test('<type> reflects the trip activity (V3-14)', () {
final r = ride(segmentCount: 1, perSegment: 1);
final bike = trip.copyWith(activity: Activity.bicycle);
final doc = XmlDocument.parse(gpx(bike, r.segments, r.points, 'Ride'));
expect(doc.findAllElements('type').single.innerText, 'cycling');
});
test('<type> is absent, not empty, for Activity.other (V3-14)', () {
final r = ride(segmentCount: 1, perSegment: 1);
final other = trip.copyWith(activity: Activity.other);
final doc = XmlDocument.parse(gpx(other, r.segments, r.points, 'Ride'));
expect(doc.findAllElements('type'), isEmpty,
reason: 'an empty <type/> would falsely claim the element exists');
});
test('gpxActivityType covers every activity without throwing', () {
for (final activity in Activity.values) {
// Must not throw; only Activity.other is allowed to map to null.
final type = gpxActivityType(activity);
expect(type == null, activity == Activity.other);
}
});
});
group('geojson', () {