summaryrefslogtreecommitdiff
path: root/lib/services/log_service.dart
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-08 00:05:39 +0300
committerPaul Buetow <paul@buetow.org>2026-05-08 00:05:39 +0300
commit3e4bacb7b939b1de98a2fb07115f638750637357 (patch)
tree0897a6854d1c3ca3b1d0252657e992abbba061ba /lib/services/log_service.dart
parent665b150727ee7259e398d38d1f6bc51b4c2d4a1c (diff)
Rewrite as Flutter app and rename to Quicklogmain
Drop the Go/Fyne implementation and replace it with a native Flutter app targeting Android (primary) and Linux desktop (development). Rename quicklogger -> quicklog throughout (project, applicationId, MethodChannel, cache filename, AppBar title, Linux binary). Storage on Android moves to /Android/data/org.buetow.quicklog/files/ so MANAGE_EXTERNAL_STORAGE is no longer required. Share-intent receive is preserved via a Kotlin ShareActivity that writes shared text to the app cache, which Dart reads through a MethodChannel on app resume; MainActivity also accepts SEND directly so launchers that prefer the main target work. New since the Fyne version: an entry browser screen with read-only viewer and long-press delete. Cross-compiling to Android ARM from amd64 Linux no longer needs Docker / fyne-cross / NDK -- flutter build apk emits ARM binaries directly. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diffstat (limited to 'lib/services/log_service.dart')
-rw-r--r--lib/services/log_service.dart57
1 files changed, 57 insertions, 0 deletions
diff --git a/lib/services/log_service.dart b/lib/services/log_service.dart
new file mode 100644
index 0000000..f2f662c
--- /dev/null
+++ b/lib/services/log_service.dart
@@ -0,0 +1,57 @@
+import 'dart:io';
+
+import 'package:intl/intl.dart';
+import 'package:path/path.dart' as p;
+
+class LogEntry {
+ LogEntry({required this.file, required this.timestamp});
+ final File file;
+ final DateTime timestamp;
+}
+
+final _filenameRegex = RegExp(r'^ql-(\d{6})-(\d{6})\.md$');
+final _timestampFormat = DateFormat('yyMMdd-HHmmss');
+
+Future<File> logEntry(String dir, String text, {DateTime? now}) async {
+ final stamp = _timestampFormat.format(now ?? DateTime.now());
+ final file = File(p.join(dir, 'ql-$stamp.md'));
+ await file.writeAsString(text);
+ return file;
+}
+
+Future<List<LogEntry>> listEntries(String dir) async {
+ final directory = Directory(dir);
+ if (!await directory.exists()) return const [];
+ final entries = <LogEntry>[];
+ await for (final entity in directory.list(followLinks: false)) {
+ if (entity is! File) continue;
+ final ts = _parseFilename(p.basename(entity.path));
+ if (ts == null) continue;
+ entries.add(LogEntry(file: entity, timestamp: ts));
+ }
+ entries.sort((a, b) => b.timestamp.compareTo(a.timestamp));
+ return entries;
+}
+
+Future<void> deleteEntry(File f) async {
+ if (await f.exists()) await f.delete();
+}
+
+DateTime? _parseFilename(String name) {
+ final m = _filenameRegex.firstMatch(name);
+ if (m == null) return null;
+ final d = m.group(1)!; // YYMMDD
+ final t = m.group(2)!; // HHMMSS
+ try {
+ return DateTime(
+ 2000 + int.parse(d.substring(0, 2)),
+ int.parse(d.substring(2, 4)),
+ int.parse(d.substring(4, 6)),
+ int.parse(t.substring(0, 2)),
+ int.parse(t.substring(2, 4)),
+ int.parse(t.substring(4, 6)),
+ );
+ } catch (_) {
+ return null;
+ }
+}