Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Events Filter Timezone #255

Merged
merged 3 commits into from
Aug 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 20 additions & 18 deletions lib/api/events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
});
}
Expand All @@ -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' : ''}',
);

Expand All @@ -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',
},
),
Expand Down
4 changes: 2 additions & 2 deletions lib/providers/events_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
17 changes: 15 additions & 2 deletions lib/providers/settings_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -335,9 +335,19 @@ class SettingsProvider extends UnityProvider {
def: DateFormat('hh:mm a'),
key: 'application.time_format',
);
final kConvertTimeToLocalTimezone = _SettingsOption<bool>(
def: false,

// TODO(bdlukaa): remove this in future releases
var _hasMigratedTimezone = false;
late final kConvertTimeToLocalTimezone = _SettingsOption<bool>(
def: true,
key: 'application.convert_time_to_local_timezone',
loadFrom: (value) {
if (!_hasMigratedTimezone) {
_hasMigratedTimezone = true;
return true;
}
return bool.tryParse(value) ?? true;
},
);

// Window
Expand Down Expand Up @@ -437,6 +447,8 @@ class SettingsProvider extends UnityProvider {
Future<void> initialize() async {
final data = await tryReadStorage(() => settings.read());

_hasMigratedTimezone = data['hasMigratedTimezone'] == 'true';

await Future.wait([
kLayoutCyclePeriod.loadData(data),
kLayoutCycleEnabled.loadData(data),
Expand Down Expand Up @@ -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),
Expand Down
21 changes: 21 additions & 0 deletions lib/utils/date.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}
}
Loading