screen-locker/stronglift_replacement/workout_app/lib/services/position_source.dart
Krzysztof kuhy Rudnicki 6777656418 Bridge GPS dropouts in run distance
The PC keeps a dropout moving at 1 m/s to 25 km/h; the app zeroed
every gap over 30 s. Bridge unpaused dropouts, pauses stay zero.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzxdWXcjiPpgRfxzrRfoky
2026-11-10 19:11:42 +01:00

46 lines
1.6 KiB
Dart

/// The seam between the recorder and the platform's location provider.
///
/// Everything above this interface (recorder, map, sandbox replay) is pure
/// Dart and runs on the Linux test host and the desktop target; only
/// `GeolocatorPositionSource` touches the geolocator plugin.
library;
import 'package:workout_app/services/gps_filter.dart';
/// Whether the app may read the location right now.
enum LocationAccess {
/// Permission granted and the location service is on.
granted,
/// Permission refused this time; asking again may work.
denied,
/// Permission refused for good; only the system settings can change it.
deniedForever,
/// Permission is fine but the device's location switch is off.
serviceOff;
/// Whether fixes can be read right now.
bool get isGranted => this == LocationAccess.granted;
}
/// A stream of GPS fixes plus the permission handshake that guards it.
abstract class PositionSource {
/// Asks for location permission (this may show the system prompt); never
/// throws for a refusal.
Future<LocationAccess> requestAccess();
/// Reads the access as it stands, without ever prompting. For re-checks
/// when the app comes back to the foreground: the permission dialog itself
/// backgrounds the app, so re-asking there would loop.
Future<LocationAccess> checkAccess();
/// Fixes roughly every [interval], best accuracy, until cancelled.
///
/// [interval] must stay well under the PC's 30 s credit gap
/// (`kMaxCreditGapSeconds`): a quieter stream is treated as a dropout and
/// only counts at 1 m/s or faster.
Stream<GpsFix> fixes({Duration interval = const Duration(seconds: 2)});
}