// Represents a collection of landmarks that represent a journey // Different instances of a Trip can be saved and loaded by the user import 'dart:collection'; import 'dart:convert'; import 'package:anyway/structs/landmark.dart'; import 'package:shared_preferences/shared_preferences.dart'; class Trip { final String uuid; final String cityName; // TODO: cityName should be inferred from coordinates of the Landmarks final int totalTime; final LinkedList<Landmark> landmarks; // could be empty as well Trip({ required this.uuid, required this.cityName, required this.landmarks, this.totalTime = 0 }); factory Trip.fromJson(Map<String, dynamic> json) { Trip trip = Trip( uuid: json['uuid'], cityName: json['city_name'] ?? 'Not communicated', landmarks: LinkedList() ); return trip; } factory Trip.fromPrefs(SharedPreferences prefs, String uuid) { String? content = prefs.getString('trip_$uuid'); Map<String, dynamic> json = jsonDecode(content!); Trip trip = Trip.fromJson(json); String? firstUUID = json['entry_uuid']; readLandmarks(trip.landmarks, prefs, firstUUID); return trip; } Map<String, dynamic> toJson() => { 'uuid': uuid, 'city_name': cityName, 'first_landmark_uuid': landmarks.first.uuid }; void toPrefs(SharedPreferences prefs){ Map<String, dynamic> json = toJson(); prefs.setString('trip_$uuid', jsonEncode(json)); for (Landmark landmark in landmarks) { landmarkToPrefs(prefs, landmark, landmark.next); } } } // Helper readLandmarks(LinkedList<Landmark> landmarks, SharedPreferences prefs, String? firstUUID) { while (firstUUID != null) { var (head, nextUUID) = getLandmarkFromPrefs(prefs, firstUUID); landmarks.add(head); firstUUID = nextUUID; } } void removeAllTripsFromPrefs () async { SharedPreferences prefs = await SharedPreferences.getInstance(); prefs.clear(); }