diff --git a/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png b/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png index a4b3758..791200f 100644 Binary files a/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png and b/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_background.png differ diff --git a/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png index ede3642..d4e1eca 100644 Binary files a/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png and b/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ diff --git a/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png b/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png index 31e7cce..b0dc1a5 100644 Binary files a/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png and b/firka/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png differ diff --git a/firka/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/firka/android/app/src/main/res/mipmap-hdpi/launcher_icon.png index 630f7d9..236f11b 100644 Binary files a/firka/android/app/src/main/res/mipmap-hdpi/launcher_icon.png and b/firka/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/firka/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/firka/android/app/src/main/res/mipmap-mdpi/launcher_icon.png index c7c3b95..cb91172 100644 Binary files a/firka/android/app/src/main/res/mipmap-mdpi/launcher_icon.png and b/firka/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/firka/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/firka/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png index f55a4d5..b6de93a 100644 Binary files a/firka/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png and b/firka/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/firka/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/firka/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png index a816189..0a35a69 100644 Binary files a/firka/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png and b/firka/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/firka/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/firka/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png index 86054c6..2125e79 100644 Binary files a/firka/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png and b/firka/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/firka/scripts/codegen.dart b/firka/scripts/codegen.dart new file mode 100644 index 0000000..00d5e97 --- /dev/null +++ b/firka/scripts/codegen.dart @@ -0,0 +1,137 @@ +import 'dart:io'; + +import 'package:path/path.dart' as p; + +void main() async { + final root = _projectRoot(); + var ran = false; + + if (_iconsOutOfDate(root)) { + stdout.writeln('Icons out of date, running flutter_launcher_icons...'); + await _run('dart', ['run', 'flutter_launcher_icons'], root); + ran = true; + } + + if (_l10nOutOfDate(root)) { + stdout.writeln('l10n out of date, running flutter gen-l10n...'); + await _run('flutter', [ + 'gen-l10n', + '--template-arb-file', + 'app_hu.arb', + ], root); + ran = true; + } + + if (_isarOutOfDate(root)) { + stdout.writeln( + 'Isar generated dart files out of date, running build_runner...', + ); + await _run('dart', ['run', 'build_runner', 'build'], root); + ran = true; + } + + if (!ran) { + stdout.writeln('All generated files are up to date.'); + } +} + +String _projectRoot() { + final script = p.canonicalize(Platform.script.toFilePath()); + return p.dirname(p.dirname(script)); +} + +DateTime? _modified(File file) { + if (!file.existsSync()) return null; + return file.lastModifiedSync(); +} + +bool _anyNewerThan(Iterable inputs, File output) { + final outTime = _modified(output); + if (outTime == null) return true; + for (final f in inputs) { + final t = _modified(f); + if (t != null && t.isAfter(outTime)) return true; + } + return false; +} + +bool _iconsOutOfDate(String root) { + final config = File(p.join(root, 'flutter_launcher_icons.yaml')); + final pubspec = File(p.join(root, 'pubspec.yaml')); + final imagePath = File(p.join(root, 'assets/images/logos/colored_logo.webp')); + final monochrome = File( + p.join(root, 'assets/images/logos/monochrome_logo.png'), + ); + final background = File( + p.join(root, 'assets/images/logos/colored_logo_without_mustache.png'), + ); + final foreground = File( + p.join(root, 'assets/images/logos/colored_logo_only_mustache.png'), + ); + + final inputs = [ + config, + pubspec, + imagePath, + monochrome, + background, + foreground, + ].where((f) => f.existsSync()).map((f) => File(p.canonicalize(f.path))); + final output = File( + p.join( + root, + 'android/app/src/main/res/mipmap-anydpi-v26/launcher_icon.xml', + ), + ); + return _anyNewerThan(inputs, output); +} + +bool _l10nOutOfDate(String root) { + final l10nDir = p.join(root, 'lib/l10n'); + final l10nYml = File(p.join(root, 'l10n.yml')); + final arbs = Directory(l10nDir) + .listSync() + .whereType() + .where((f) => f.path.endsWith('.arb')) + .map((f) => File(p.canonicalize(f.path))) + .toList(); + final inputs = [l10nYml, ...arbs].where((f) => f.existsSync()).cast(); + final output = File(p.join(root, 'lib/l10n/app_localizations.dart')); + return _anyNewerThan(inputs, output); +} + +bool _isarOutOfDate(String root) { + final modelsDir = p.join(root, 'lib/helpers/db/models'); + if (!Directory(modelsDir).existsSync()) return false; + + for (final entity in Directory(modelsDir).listSync()) { + if (entity is! File || !entity.path.endsWith('.dart')) continue; + final content = entity.readAsStringSync(); + if (!content.contains("part '") || !content.contains('.g.dart')) continue; + + final baseName = p.basenameWithoutExtension(entity.path); + final gPath = p.join(modelsDir, '$baseName.g.dart'); + final dartFile = File(p.canonicalize(entity.path)); + final gFile = File(gPath); + if (_anyNewerThan([dartFile], gFile)) return true; + } + return false; +} + +Future _run( + String executable, + List args, + String workingDirectory, +) async { + final result = await Process.run( + executable, + args, + workingDirectory: workingDirectory, + runInShell: true, + ); + if (result.exitCode != 0) { + stderr.write(result.stderr); + exit(result.exitCode); + } + return true; +}