Refactor lesson data handling in ServerSyncProvider to include breaks between lessons and improve clarity
This commit is contained in:
@@ -34,7 +34,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
Lesson? prevLesson;
|
||||
List<Lesson>? nextLessons;
|
||||
|
||||
// new variables
|
||||
static bool hasActivityStarted = false;
|
||||
static bool hasDayEnd = false;
|
||||
static bool hasUserDismissed = false;
|
||||
@@ -43,7 +42,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
// ignore: non_constant_identifier_names
|
||||
static Map<String, String> LAData = {};
|
||||
static DateTime? now;
|
||||
//
|
||||
|
||||
LiveCardState currentState = LiveCardState.empty;
|
||||
// ignore: unused_field
|
||||
@@ -66,12 +64,8 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
? Duration(seconds: settings.bellDelay)
|
||||
: Duration.zero;
|
||||
|
||||
// Token figyelése: amikor az APNs tokent ad (első vagy rotation), regisztráljuk a szerverrel
|
||||
PlatformChannel.onTokenUpdated = (pushToken, deviceId, bundleId) {
|
||||
if (!_settings.liveActivityEnabled) {
|
||||
debugPrint("Push token érkezett, de Live Activity nincs engedélyezve - skip");
|
||||
return;
|
||||
}
|
||||
if (!_settings.liveActivityEnabled) return;
|
||||
debugPrint("Push token érkezett: $pushToken");
|
||||
serverSync.registerAndSync(
|
||||
deviceId: deviceId,
|
||||
@@ -82,7 +76,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
);
|
||||
};
|
||||
|
||||
// Ha a user dismiss-eli a Live Activity-t (swipe), értesítjük a szervert
|
||||
PlatformChannel.onActivityDismissed = (deviceId) {
|
||||
debugPrint("Live Activity dismissed - unregistering from server");
|
||||
serverSync.forceUnregister(deviceId);
|
||||
@@ -93,9 +86,7 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
update();
|
||||
}
|
||||
|
||||
// Debugging
|
||||
static DateTime _now() {
|
||||
// return DateTime(2023, 9, 27, 9, 30);
|
||||
return DateTime.now();
|
||||
}
|
||||
|
||||
@@ -116,8 +107,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Map<String, String> toMap() {
|
||||
// print("LIVE ACTIVITY COLOR BELOW:");
|
||||
// print(_settings.liveActivityColor.toHexString().substring(2));
|
||||
String color = '#${_settings.liveActivityColor.toHexString().substring(2)}';
|
||||
|
||||
switch (currentState) {
|
||||
@@ -281,8 +270,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
storeFirstRunDate = now;
|
||||
}
|
||||
|
||||
// Filter cancelled lessons #20
|
||||
// Filter label lessons #128
|
||||
today = today
|
||||
.where((lesson) =>
|
||||
lesson.status?.name != "Elmaradt" &&
|
||||
@@ -291,7 +278,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
.toList();
|
||||
|
||||
if (today.isNotEmpty) {
|
||||
// sort
|
||||
today.sort((a, b) => a.start.compareTo(b.start));
|
||||
|
||||
final _lesson = today.firstWhere(
|
||||
@@ -347,13 +333,10 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
currentState = LiveCardState.empty;
|
||||
}
|
||||
|
||||
//LIVE ACTIVITIES
|
||||
debugPrint("LA DEBUG: state=$currentState, today=${today.length}, "
|
||||
"current=${currentLesson?.subject.name}, next=${nextLesson?.subject.name}, "
|
||||
"hasStarted=$hasActivityStarted, dismissed=$hasUserDismissed, "
|
||||
"enabled=${_settings.liveActivityEnabled}, weekday=${now.weekday}, hour=${now.hour}");
|
||||
|
||||
// Guard: if not enabled, stop any running activity and skip
|
||||
if (!_settings.liveActivityEnabled) {
|
||||
if (hasActivityStarted) {
|
||||
debugPrint("Live Activity nincs engedélyezve, de fut – leállítás...");
|
||||
@@ -363,7 +346,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
}
|
||||
} else {
|
||||
|
||||
//CREATE
|
||||
if (!hasActivityStarted &&
|
||||
!hasUserDismissed &&
|
||||
nextLesson != null &&
|
||||
@@ -384,7 +366,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
hasActivityStarted = true;
|
||||
_createAndSync();
|
||||
}
|
||||
// Fake mód: mindig hozzuk létre a Live Activity-t ha nincs elindítva
|
||||
else if (!hasActivityStarted &&
|
||||
_settings.developerMode &&
|
||||
_settings.devLiveFakeLessons &&
|
||||
@@ -395,7 +376,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
_createAndSync();
|
||||
}
|
||||
|
||||
//UPDATE
|
||||
else if (hasActivityStarted) {
|
||||
if (hasActivitySettingsChanged) {
|
||||
debugPrint("Valamelyik beállítás megváltozott. Frissítés...");
|
||||
@@ -421,10 +401,7 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
//END
|
||||
// Fake módban ne fejezzük be a Live Activity-t
|
||||
if (_settings.developerMode && _settings.devLiveFakeLessons) {
|
||||
// skip end logic in fake mode
|
||||
} else if ((currentState == LiveCardState.afternoon ||
|
||||
currentState == LiveCardState.morning ||
|
||||
currentState == LiveCardState.night) &&
|
||||
@@ -476,8 +453,6 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
if (!_settings.developerMode || !_settings.devLiveFakeLessons) {
|
||||
return real;
|
||||
}
|
||||
// Fake mód: ha vannak valódi órák, a fake órákat utánuk rakjuk
|
||||
// DE: ha az utolsó valódi óra már véget ért, a fake-ek a jelen idő köré kerülnek
|
||||
if (real.isNotEmpty) {
|
||||
final sorted = List<Lesson>.from(real)
|
||||
..sort((a, b) => a.end.compareTo(b.end));
|
||||
@@ -485,17 +460,15 @@ class LiveCardProvider extends ChangeNotifier {
|
||||
final now = _now();
|
||||
final nextIndex = sorted.length;
|
||||
if (lastEnd.isBefore(now)) {
|
||||
// Az órák már véget értek — fake órákat a jelen idő köré
|
||||
return [...real, ..._generateFakeLessons(startIndex: nextIndex)];
|
||||
}
|
||||
// Van még óra — fake órákat az utolsó után
|
||||
|
||||
final fakeStart = lastEnd.add(const Duration(minutes: 10));
|
||||
return [...real, ..._generateFakeLessons(baseStart: fakeStart, startIndex: nextIndex)];
|
||||
}
|
||||
return _generateFakeLessons();
|
||||
}
|
||||
|
||||
/// Generál fake órákat a jelenlegi idő köré, hogy a Live Activity tesztelhető legyen.
|
||||
static List<Lesson> _generateFakeLessons({DateTime? baseStart, int startIndex = 0}) {
|
||||
final now = _now();
|
||||
final start0 = baseStart ?? now.subtract(const Duration(minutes: 10));
|
||||
|
||||
@@ -32,7 +32,6 @@ class ServerSyncProvider {
|
||||
}
|
||||
}
|
||||
|
||||
/// Token rotation esetén frissíti a tokent a szerveren.
|
||||
Future<void> refreshToken({
|
||||
required String pushToken,
|
||||
required String bundleId,
|
||||
@@ -85,18 +84,38 @@ class ServerSyncProvider {
|
||||
final dateStr =
|
||||
'${now.year}-${now.month.toString().padLeft(2, '0')}-${now.day.toString().padLeft(2, '0')}';
|
||||
|
||||
final lessonsJson = lessons
|
||||
.map((l) => {
|
||||
'index': l.lessonIndex.toString(),
|
||||
'subject': l.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: l.subject).capital(),
|
||||
'icon': SubjectIcon.resolveName(subject: l.subject),
|
||||
'room': l.room.replaceAll('_', ' '),
|
||||
'description': l.description,
|
||||
'start': l.start.millisecondsSinceEpoch,
|
||||
'end': l.end.millisecondsSinceEpoch,
|
||||
})
|
||||
.toList();
|
||||
final entries = <Map<String, dynamic>>[];
|
||||
|
||||
for (int i = 0; i < lessons.length; i++) {
|
||||
final l = lessons[i];
|
||||
entries.add({
|
||||
'type': 'lesson',
|
||||
'index': l.lessonIndex.toString(),
|
||||
'subject': l.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: l.subject).capital(),
|
||||
'icon': SubjectIcon.resolveName(subject: l.subject),
|
||||
'room': l.room.replaceAll('_', ' '),
|
||||
'description': l.description,
|
||||
'start': l.start.millisecondsSinceEpoch,
|
||||
'end': l.end.millisecondsSinceEpoch,
|
||||
});
|
||||
|
||||
if (i < lessons.length - 1) {
|
||||
final next = lessons[i + 1];
|
||||
if (l.end.isBefore(next.start)) {
|
||||
entries.add({
|
||||
'type': 'break',
|
||||
'start': l.end.millisecondsSinceEpoch,
|
||||
'end': next.start.millisecondsSinceEpoch,
|
||||
'nextSubject': next.subject.renamedTo ??
|
||||
ShortSubject.resolve(subject: next.subject).capital(),
|
||||
'nextIcon': SubjectIcon.resolveName(subject: next.subject),
|
||||
'nextRoom': next.room.replaceAll('_', ' '),
|
||||
'nextIndex': next.lessonIndex.toString(),
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final response = await http.post(
|
||||
Uri.parse('$_baseUrl/schedule'),
|
||||
@@ -104,13 +123,13 @@ class ServerSyncProvider {
|
||||
body: jsonEncode({
|
||||
'device_id': deviceId,
|
||||
'date': dateStr,
|
||||
'lessons': lessonsJson,
|
||||
'lessons': entries,
|
||||
}),
|
||||
).timeout(const Duration(seconds: 10));
|
||||
if (response.statusCode != 200 && response.statusCode != 201) {
|
||||
debugPrint('ServerSync schedule hiba: ${response.statusCode} ${response.body}');
|
||||
} else {
|
||||
debugPrint('ServerSync: ${lessons.length} óra feltöltve ($dateStr)');
|
||||
debugPrint('ServerSync: ${entries.length} elem feltöltve ($dateStr)');
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('ServerSync schedule kivétel: $e');
|
||||
@@ -122,7 +141,6 @@ class ServerSyncProvider {
|
||||
await forceUnregister(_deviceId!);
|
||||
}
|
||||
|
||||
/// Unregister egy adott deviceId-vel, akkor is ha a _deviceId nincs beállítva (pl. app restart után).
|
||||
Future<void> forceUnregister(String deviceId) async {
|
||||
try {
|
||||
final response = await http.post(
|
||||
|
||||
Reference in New Issue
Block a user