diff --git a/lib/api/events.dart b/lib/api/events.dart index 913ee8e9..9e30f501 100644 --- a/lib/api/events.dart +++ b/lib/api/events.dart @@ -30,11 +30,23 @@ extension EventsExtension on API { 'The device must be present on the server', ); + if (startTime != null && endTime != null) { + if (startTime == endTime) { + startTime = startTime.subtract(const Duration( + hours: 23, + minutes: 59, + seconds: 59, + )); + } + } + final startTimeString = startTime?.toIso8601StringWithTimezoneOffset(); + final endTimeString = endTime?.toIso8601StringWithTimezoneOffset(); + return compute(_getEvents, { 'server': server, 'limit': (startTime != null && endTime != null) ? -1 : await eventsLimit, - 'startTime': startTime, - 'endTime': endTime, + 'startTime': startTimeString, + 'endTime': endTimeString, 'device_id': device?.id, }); } @@ -46,27 +58,17 @@ extension EventsExtension on API { return []; } - var startTime = (data['startTime'] as DateTime?)?.toLocal(); - final endTime = (data['endTime'] as DateTime?)?.toLocal(); + var startTime = data['startTime'] as String?; + final endTime = data['endTime'] as String?; final deviceId = data['device_id'] as int?; final limit = (data['limit'] as int?) ?? -1; - if (startTime != null && endTime != null) { - if (startTime == endTime) { - startTime = startTime.subtract(const Duration( - hours: 23, - minutes: 59, - seconds: 59, - )); - } - } - DevHttpOverrides.configureCertificates(); debugPrint( 'Getting events for server ${server.name} with limit $limit ' - '${startTime != null ? 'from ${startTime.toIso8601String()} ' : ''}' - '${endTime != null ? 'to ${endTime.toIso8601String()} ' : ''}' + '${startTime != null ? 'from $startTime ' : ''}' + '${endTime != null ? 'to $endTime ' : ''}' '${deviceId != null ? 'for device $deviceId' : ''}', ); @@ -78,8 +80,8 @@ extension EventsExtension on API { { 'XML': '1', 'limit': '$limit', - if (startTime != null) 'startTime': startTime.toIso8601String(), - if (endTime != null) 'endTime': endTime.toIso8601String(), + if (startTime != null) 'startTime': startTime, + if (endTime != null) 'endTime': endTime, if (deviceId != null) 'device_id': '$deviceId', }, ), diff --git a/lib/providers/events_provider.dart b/lib/providers/events_provider.dart index 54270909..ac97a6b5 100644 --- a/lib/providers/events_provider.dart +++ b/lib/providers/events_provider.dart @@ -161,8 +161,8 @@ extension EventsScreenProvider on EventsProvider { await Future.wait(allowedDevices.map((device) async { final iterable = (await API.instance.getEvents( server, - startTime: startDate?.toUtc(), - endTime: endDate?.toUtc(), + startTime: startDate, + endTime: endDate, device: device, )) .toList() diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index d252e996..8965b6bd 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -335,9 +335,19 @@ class SettingsProvider extends UnityProvider { def: DateFormat('hh:mm a'), key: 'application.time_format', ); - final kConvertTimeToLocalTimezone = _SettingsOption( - def: false, + + // TODO(bdlukaa): remove this in future releases + var _hasMigratedTimezone = false; + late final kConvertTimeToLocalTimezone = _SettingsOption( + def: true, key: 'application.convert_time_to_local_timezone', + loadFrom: (value) { + if (!_hasMigratedTimezone) { + _hasMigratedTimezone = true; + return true; + } + return bool.tryParse(value) ?? true; + }, ); // Window @@ -437,6 +447,8 @@ class SettingsProvider extends UnityProvider { Future initialize() async { final data = await tryReadStorage(() => settings.read()); + _hasMigratedTimezone = data['hasMigratedTimezone'] == 'true'; + await Future.wait([ kLayoutCyclePeriod.loadData(data), kLayoutCycleEnabled.loadData(data), @@ -550,6 +562,7 @@ class SettingsProvider extends UnityProvider { kTimeFormat.key: kTimeFormat.saveAs(kTimeFormat.value), kConvertTimeToLocalTimezone.key: kConvertTimeToLocalTimezone .saveAs(kConvertTimeToLocalTimezone.value), + 'hasMigratedTimezone': _hasMigratedTimezone.toString(), kLaunchAppOnStartup.key: kLaunchAppOnStartup.saveAs(kLaunchAppOnStartup.value), kMinimizeToTray.key: kMinimizeToTray.saveAs(kMinimizeToTray.value), diff --git a/lib/utils/date.dart b/lib/utils/date.dart index 682e7873..122dd0dc 100644 --- a/lib/utils/date.dart +++ b/lib/utils/date.dart @@ -198,4 +198,25 @@ extension DateTimeExtension on DateTime? { return '$dateString ${timeFormatter.format(date!)}'; } + + String toIso8601StringWithTimezoneOffset() { + if (this == null) return '${null}'; + + late final DateTime date; + if (SettingsProvider.instance.kConvertTimeToLocalTimezone.value) { + date = this!.toLocal(); + } else { + date = this!; + } + + final offset = date.timeZoneOffset; + final isoString = date.toIso8601String(); + if (offset == Duration.zero) return isoString; + + final offsetString = '${offset.isNegative ? '-' : '+'}' + '${offset.inHours.toString().replaceAll('-', '').replaceAll('+', '').padLeft(2, '0')}:' + '${offset.inMinutes.remainder(60).toString().padLeft(2, '0')}'; + + return '$isoString$offsetString'; + } }