2022-08-04 06:46:39 +00:00
|
|
|
import 'package:photos/core/event_bus.dart';
|
|
|
|
import 'package:photos/db/files_db.dart';
|
|
|
|
import 'package:photos/events/local_photos_updated_event.dart';
|
|
|
|
import 'package:photos/models/file.dart';
|
|
|
|
|
|
|
|
class SearchService {
|
|
|
|
List<File> _cachedFiles;
|
2022-08-06 13:44:52 +00:00
|
|
|
Future<List<File>> _future;
|
2022-08-04 06:46:39 +00:00
|
|
|
|
|
|
|
SearchService._privateConstructor();
|
|
|
|
static final SearchService instance = SearchService._privateConstructor();
|
|
|
|
|
|
|
|
Future<void> init() async {
|
2022-08-06 12:35:29 +00:00
|
|
|
// Intention of delay is to give more CPU cycles to other tasks
|
|
|
|
Future.delayed(const Duration(seconds: 5), () async {
|
2022-08-06 13:44:52 +00:00
|
|
|
_future == null
|
|
|
|
? //in case home screen loads before 5 seconds and user starts search, future will not be null
|
|
|
|
FilesDB.instance
|
|
|
|
.getAllFilesFromDB()
|
|
|
|
.then((value) => _cachedFiles = value)
|
|
|
|
: null;
|
2022-08-06 12:35:29 +00:00
|
|
|
});
|
2022-08-04 06:46:39 +00:00
|
|
|
|
|
|
|
Bus.instance.on<LocalPhotosUpdatedEvent>().listen((event) {
|
|
|
|
_cachedFiles = null;
|
|
|
|
getAllFiles();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<List<File>> getAllFiles() async {
|
2022-08-06 13:44:52 +00:00
|
|
|
if (_cachedFiles != null) {
|
|
|
|
return _cachedFiles;
|
|
|
|
}
|
|
|
|
if (_future != null) {
|
|
|
|
return _future;
|
|
|
|
}
|
2022-08-06 15:26:07 +00:00
|
|
|
_future = _fetchAllFiles();
|
2022-08-06 13:44:52 +00:00
|
|
|
return _future;
|
|
|
|
}
|
|
|
|
|
2022-08-06 15:26:07 +00:00
|
|
|
Future<List<File>> _fetchAllFiles() async {
|
2022-08-04 06:46:39 +00:00
|
|
|
_cachedFiles ??= await FilesDB.instance.getAllFilesFromDB();
|
|
|
|
return _cachedFiles;
|
|
|
|
}
|
2022-08-06 12:35:29 +00:00
|
|
|
|
2022-08-06 15:26:07 +00:00
|
|
|
Future<List<File>> getFilesOnFilenameSearch(String query) async {
|
|
|
|
List<File> matchedFiles = [];
|
|
|
|
List<File> files = await getAllFiles();
|
|
|
|
//<20 to limit number of files in result
|
|
|
|
for (int i = 0; (i < files.length) && (matchedFiles.length < 20); i++) {
|
|
|
|
File file = files[i];
|
|
|
|
if (file.title.contains(RegExp(query, caseSensitive: false))) {
|
|
|
|
matchedFiles.add(file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return matchedFiles;
|
|
|
|
}
|
|
|
|
|
2022-08-06 12:35:29 +00:00
|
|
|
void clearCachedFiles() {
|
|
|
|
_cachedFiles.clear();
|
|
|
|
}
|
2022-08-04 06:46:39 +00:00
|
|
|
}
|