Skip to content

Commit 90693a6

Browse files
authored
Events Time Filter (#248)
2 parents 7e2ff5e + ada083f commit 90693a6

30 files changed

+558
-165
lines changed

bluecherry_appcast.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
33
<channel>
44
<title>Bluecherry - Appcast</title>
5+
<item>
6+
<title>Version 3.0.0-beta17</title>
7+
<description>Fixed Secondary Windows; Improved logging; and Addressed memory leaks and stream continuity.</description>
8+
<pubDate>Fri, 07 Jun 2024</pubDate>
9+
</item>
510
<item>
611
<title>Version 3.0.0-beta16</title>
712
<description>Improved iOS support, improved events fetching logic and performance and implemented software zoom.</description>

installer/windows-installer.iss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
33

44
#define MyAppName "Bluecherry DVR"
5-
#define MyAppVersion "3.0.0-beta16"
5+
#define MyAppVersion "3.0.0-beta17"
66
#define MyAppPublisher "Bluecherry DVR"
77
#define MyAppURL "https://www.bluecherrydvr.com/"
88
#define MyAppExeName "bluecherry_client.exe"

lib/api/events.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:bluecherry_client/api/api_helpers.dart';
55
import 'package:bluecherry_client/models/device.dart';
66
import 'package:bluecherry_client/models/event.dart';
77
import 'package:bluecherry_client/models/server.dart';
8+
import 'package:bluecherry_client/utils/date.dart';
89
import 'package:bluecherry_client/utils/methods.dart';
910
import 'package:flutter/foundation.dart';
1011
import 'package:xml2json/xml2json.dart';
@@ -45,8 +46,8 @@ extension EventsExtension on API {
4546
return [];
4647
}
4748

48-
var startTime = data['startTime'] as DateTime?;
49-
final endTime = data['endTime'] as DateTime?;
49+
var startTime = (data['startTime'] as DateTime?)?.toLocal();
50+
final endTime = (data['endTime'] as DateTime?)?.toLocal();
5051
final deviceId = data['device_id'] as int?;
5152
final limit = (data['limit'] as int?) ?? -1;
5253

@@ -151,11 +152,11 @@ extension EventsExtension on API {
151152
title: e['title']['\$t'],
152153
publishedRaw: e['published']['\$t'],
153154
published: e['published'] == null || e['published']['\$t'] == null
154-
? DateTime.now()
155+
? DateTimeExtension.now()
155156
: DateTime.parse(e['published']['\$t']),
156157
updatedRaw: e['updated']['\$t'] ?? e['published']['\$t'],
157158
updated: e['updated'] == null || e['updated']['\$t'] == null
158-
? DateTime.now()
159+
? DateTimeExtension.now()
159160
: DateTime.parse(e['updated']['\$t']),
160161
category: e['category']['term'],
161162
mediaID: !e.containsKey('content')

lib/l10n/app_en.arb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
"lastImageUpdate": "Last Image Update",
136136
"fps": "FPS",
137137
"date": "Date",
138+
"time": "Time",
138139
"lastUpdate": "Last Update",
139140
"screens": "Screens",
140141
"directCamera": "Direct Camera",
@@ -332,13 +333,16 @@
332333
}
333334
}
334335
},
335-
"timeFilter": "Time filter",
336+
"period": "Period",
337+
"dateTimeFilter": "Date and Time Filter",
338+
"dateFilter": "Date Filter",
339+
"timeFilter": "Time Filter",
336340
"fromDate": "From",
337341
"toDate": "To",
338342
"today": "Today",
339343
"yesterday": "Yesterday",
340344
"never": "never",
341-
"fromToDate": "{from} to {to}",
345+
"fromToDate": "From {from} to {to}",
342346
"@fromToDate": {
343347
"placeholders": {
344348
"from": {
@@ -349,6 +353,17 @@
349353
}
350354
}
351355
},
356+
"@fromToTime": {
357+
"placeholders": {
358+
"from": {
359+
"type": "String"
360+
},
361+
"to": {
362+
"type": "String"
363+
}
364+
}
365+
},
366+
"mostRecent": "Most recent",
352367
"allowAlarms": "Allow alarms",
353368
"nextEvents": "Next events",
354369
"nEvents": "{n, plural, =0{No events} =1{1 event} other{{n} events}}",

lib/l10n/app_fr.arb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
"lastImageUpdate": "Dernier rafraîchissemente",
132132
"fps": "FPS",
133133
"date": "Date",
134+
"time": "Time",
134135
"lastUpdate": "Dernière mise à jour",
135136
"screens": "Écrans",
136137
"directCamera": "Caméra direct",
@@ -310,6 +311,9 @@
310311
}
311312
}
312313
},
314+
"period": "Period",
315+
"dateTimeFilter": "Date Time Filter",
316+
"dateFilter": "Date Filter",
313317
"timeFilter": "Filtre par période",
314318
"fromDate": "De",
315319
"toDate": "À",
@@ -327,6 +331,17 @@
327331
}
328332
}
329333
},
334+
"@fromToTime": {
335+
"placeholders": {
336+
"from": {
337+
"type": "String"
338+
},
339+
"to": {
340+
"type": "String"
341+
}
342+
}
343+
},
344+
"mostRecent": "Most recent",
330345
"allowAlarms": "Permettre les alarmes",
331346
"nextEvents": "Prochains évènements",
332347
"nEvents": "{n, plural, =0{Aucun évènement} =1{1 évènement} other{{n} évènements}}",

lib/l10n/app_pl.arb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
"lastImageUpdate": "Ostatnia aktualizacja obrazu",
136136
"fps": "FPS",
137137
"date": "Data",
138+
"time": "Time",
138139
"lastUpdate": "Ostatnia aktualizacja",
139140
"screens": "Ekrany",
140141
"directCamera": "Kamera bezpośrednia",
@@ -332,6 +333,9 @@
332333
}
333334
}
334335
},
336+
"period": "Period",
337+
"dateTimeFilter": "Date Time Filter",
338+
"dateFilter": "Date Filter",
335339
"timeFilter": "Filtr czasu",
336340
"fromDate": "Od",
337341
"toDate": "Do",
@@ -349,6 +353,17 @@
349353
}
350354
}
351355
},
356+
"@fromToTime": {
357+
"placeholders": {
358+
"from": {
359+
"type": "String"
360+
},
361+
"to": {
362+
"type": "String"
363+
}
364+
}
365+
},
366+
"mostRecent": "Most recent",
352367
"allowAlarms": "Zezwól na alarmy",
353368
"nextEvents": "Następne zdarzenia",
354369
"nEvents": "{n, plural, =0{Brak zdarzeń} =1{1 zdarzenie} other{{n} zdarzeń}}",

lib/l10n/app_pt.arb

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
"lastImageUpdate": "Última atualização da imagem",
136136
"fps": "FPS",
137137
"date": "Data",
138+
"time": "Hora",
138139
"lastUpdate": "Última atualização",
139140
"screens": "Câmeras",
140141
"directCamera": "Câmera específica",
@@ -332,13 +333,16 @@
332333
}
333334
}
334335
},
335-
"timeFilter": "Filtro de tempo",
336+
"period": "Período",
337+
"dateTimeFilter": "Filtro de Data e Hora",
338+
"dateFilter": "Periodo",
339+
"timeFilter": "Filtro de Tempo",
336340
"fromDate": "De",
337341
"toDate": "à",
338342
"today": "Hoje",
339343
"yesterday": "Ontem",
340344
"never": "Nunca",
341-
"fromToDate": "{from} à {to}",
345+
"fromToDate": "De {from} à {to}",
342346
"@fromToDate": {
343347
"placeholders": {
344348
"from": {
@@ -349,6 +353,17 @@
349353
}
350354
}
351355
},
356+
"@fromToTime": {
357+
"placeholders": {
358+
"from": {
359+
"type": "String"
360+
},
361+
"to": {
362+
"type": "String"
363+
}
364+
}
365+
},
366+
"mostRecent": "Mais recentes",
352367
"allowAlarms": "Permitir alarmes",
353368
"nextEvents": "Próximos eventos",
354369
"nEvents": "{n, plural, =0{Nenhum evento} =1{1 evento} other{{n} eventos}}",

lib/models/event.dart

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import 'package:bluecherry_client/models/server.dart';
2121
import 'package:bluecherry_client/providers/server_provider.dart';
22+
import 'package:bluecherry_client/utils/date.dart';
2223
import 'package:bluecherry_client/utils/extensions.dart';
2324
import 'package:flutter/widgets.dart';
2425
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
@@ -64,10 +65,11 @@ class Event {
6465
this.mediaID,
6566
this.mediaURL,
6667
}) : server = server ?? ServersProvider.instance.servers.first,
67-
publishedRaw = publishedRaw ?? DateTime.now().toIso8601String(),
68-
published = published ?? DateTime.now(),
69-
updatedRaw = updatedRaw ?? DateTime.now().toIso8601String(),
70-
updated = updated ?? DateTime.now();
68+
publishedRaw =
69+
publishedRaw ?? DateTimeExtension.now().toIso8601String(),
70+
published = published ?? DateTimeExtension.now(),
71+
updatedRaw = updatedRaw ?? DateTimeExtension.now().toIso8601String(),
72+
updated = updated ?? DateTimeExtension.now();
7173

7274
String get deviceName {
7375
return title

lib/providers/events_provider.dart

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,22 @@ class EventsProvider extends UnityProvider {
7979
save();
8080
}
8181

82-
DateTime? startTime, endTime;
82+
DateTime? _startDate;
83+
DateTime? get startDate => _startDate;
84+
set startDate(DateTime? value) {
85+
_startDate = value;
86+
notifyListeners();
87+
}
88+
89+
DateTime? _endDate;
90+
DateTime? get endDate => _endDate;
91+
set endDate(DateTime? value) {
92+
_endDate = value;
93+
notifyListeners();
94+
}
95+
96+
bool get isDateSet => _startDate != null && _endDate != null;
97+
8398
EventsMinLevelFilter _levelFilter = EventsMinLevelFilter.any;
8499
EventsMinLevelFilter get levelFilter => _levelFilter;
85100
set levelFilter(EventsMinLevelFilter value) {
@@ -122,7 +137,10 @@ class EventsProvider extends UnityProvider {
122137
}
123138

124139
extension EventsScreenProvider on EventsProvider {
125-
Future<void> loadEvents() async {
140+
Future<void> loadEvents({
141+
DateTime? startDate,
142+
DateTime? endDate,
143+
}) async {
126144
loadedEvents = LoadedEvents();
127145
_notify();
128146

@@ -140,8 +158,8 @@ extension EventsScreenProvider on EventsProvider {
140158
await Future.wait(allowedDevices.map((device) async {
141159
final iterable = (await API.instance.getEvents(
142160
server,
143-
startTime: startTime,
144-
endTime: endTime,
161+
startTime: startDate ?? this.startDate,
162+
endTime: endDate ?? this.startDate,
145163
device: device,
146164
))
147165
.toList()
@@ -157,7 +175,15 @@ extension EventsScreenProvider on EventsProvider {
157175
break;
158176
}
159177
return false;
160-
});
178+
})
179+
..removeWhere((event) {
180+
if (!isDateSet) return false;
181+
182+
return event.published.toUtc().isBefore(startDate!.toUtc()) ||
183+
event.updated.toUtc().isAfter(endDate!.toUtc());
184+
})
185+
..sort(
186+
(a, b) => b.published.toUtc().compareTo(a.published.toUtc()));
161187

162188
loadedEvents!.events[server] ??= [];
163189
loadedEvents!.events[server]!.addAll(iterable);

lib/providers/update_provider.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,8 @@ class UpdateManager extends UnityProvider {
470470
if (versions != this.versions) this.versions = versions;
471471

472472
loading = false;
473-
lastCheck = DateTime.now(); // this updates the screen already
473+
// this updates the screen already because "lastCheck" is a setter. No need to trigger the update again
474+
lastCheck = DateTime.now();
474475
} catch (error, stackTrace) {
475476
debugPrint(error.toString());
476477
debugPrint(stackTrace.toString());

lib/screens/downloads/downloads_manager.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,21 @@ class _DownloadTileState extends State<DownloadTile> {
252252
Text(eventType),
253253
Text(widget.event.deviceName),
254254
Text(widget.event.server.name),
255-
Text(widget.event.duration
256-
.humanReadable(context)),
255+
Text(
256+
() {
257+
var fileSize = '';
258+
if (isDownloaded) {
259+
final size =
260+
File(widget.downloadPath!).mbSize;
261+
fileSize =
262+
' (${size.toStringAsFixed(2)} MB)';
263+
}
264+
265+
return widget.event.duration
266+
.humanReadable(context) +
267+
fileSize;
268+
}(),
269+
),
257270
Text(at),
258271
],
259272
),

0 commit comments

Comments
 (0)