import 'dart:convert'; import 'dart:io'; import 'package:dde_gesture_manager/builder/provider_annotation.dart'; import 'package:dde_gesture_manager/extensions.dart'; import 'package:dde_gesture_manager/models/scheme.dart'; import 'package:path/path.dart' show join; import 'package:path_provider/path_provider.dart'; import 'local_schemes.dart'; export 'local_schemes.dart'; @ProviderModel() class LocalSchemes implements LocalSchemesInterface { LocalSchemes() { schemeEntries.then((value) => schemes = [LocalSchemeEntryLinux.systemDefault(), ...value..sort()]); } @override Future> get schemeEntries async { var _supportDirectory = await getApplicationSupportDirectory(); var directory = Directory(join(_supportDirectory.path, 'schemes')); if (!directory.existsSync()) directory.createSync(); return directory .list() .map((f) { LocalSchemeEntryLinux? entry; try { var content = File(f.path).readAsStringSync(); entry = LocalSchemeEntryLinux( path: f.path, scheme: Scheme.parse(content), lastModifyTime: f.statSync().modified); } catch (e) { e.sout(); } return entry; }) .where((e) => e != null) .cast() .toList(); } @ProviderModelProp() List? schemes; } class LocalSchemeEntryLinux implements LocalSchemeEntry { @override String path; @override Scheme scheme; @override DateTime lastModifyTime; LocalSchemeEntryLinux({ required this.path, required this.scheme, required this.lastModifyTime, }); LocalSchemeEntryLinux.systemDefault() : this.path = '', this.scheme = Scheme.systemDefault(), /// max value of DateTime ![Time Values and Time Range](https://262.ecma-international.org/11.0/#sec-time-values-and-time-range) this.lastModifyTime = DateTime.fromMillisecondsSinceEpoch(8640000000000000); @override save() { var file = File(path); file.writeAsStringSync(json.encode(scheme)); } @override int compareTo(other) { assert(other is LocalSchemeEntry); return lastModifyTime.isAfter(other.lastModifyTime) ? -1 : 1; } }