diff --git a/analysis_options.yaml b/analysis_options.yaml
new file mode 100644
index 000000000..f779f939d
--- /dev/null
+++ b/analysis_options.yaml
@@ -0,0 +1,5 @@
+include: package:pedantic/analysis_options.yaml
+
+analyzer:
+ exclude:
+ - lib/generated_plugin_registrant.dart
diff --git a/assets/aves_logo.svg b/assets/aves_logo.svg
index 685a245e0..dc161703a 100644
--- a/assets/aves_logo.svg
+++ b/assets/aves_logo.svg
@@ -1,87 +1 @@
-
-
+
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index f3b849bcc..971c9fc62 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -11,14 +11,20 @@ import 'package:aves/widgets/common/icons.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_native_timezone/flutter_native_timezone.dart';
+import 'package:pedantic/pedantic.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:screen/screen.dart';
+final stopwatch = Stopwatch()..start();
+
void main() {
+ debugPrint('main start, elapsed=${stopwatch.elapsed}');
// initialize binding/plugins to configure Skia before `runApp`
- WidgetsFlutterBinding.ensureInitialized();
+ WidgetsFlutterBinding.ensureInitialized(); // 220ms
+// debugPrint('main WidgetsFlutterBinding.ensureInitialized done, elapsed=${stopwatch.elapsed}');
// configure Skia cache to prevent zoomed images becoming black, cf https://github.com/flutter/flutter/issues/36191
- SystemChannels.skia.invokeMethod('Skia.setResourceCacheMaxBytes', 512 * (1 << 20));
+ SystemChannels.skia.invokeMethod('Skia.setResourceCacheMaxBytes', 512 * (1 << 20)); // <20ms
+// debugPrint('main Skia.setResourceCacheMaxBytes done, elapsed=${stopwatch.elapsed}');
runApp(AvesApp());
}
@@ -64,42 +70,55 @@ class _HomePageState extends State {
Screen.keepOn(true);
}
- setup() async {
- final permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]);
+ Future setup() async {
+ debugPrint('$runtimeType setup start, elapsed=${stopwatch.elapsed}');
+ // TODO reduce permission check time
+ final permissions = await PermissionHandler().requestPermissions([PermissionGroup.storage]); // 350ms
if (permissions[PermissionGroup.storage] != PermissionStatus.granted) {
- SystemNavigator.pop();
+ unawaited(SystemNavigator.pop());
return;
}
+// debugPrint('$runtimeType setup permission check done, elapsed=${stopwatch.elapsed}');
- await androidFileUtils.init();
- await IconUtils.init();
- await settings.init();
+ androidFileUtils.init();
+// debugPrint('$runtimeType setup androidFileUtils.init done, elapsed=${stopwatch.elapsed}');
+ // TODO notify when icons are ready for drawer and section header refresh
+ unawaited(IconUtils.init()); // 170ms
+// debugPrint('$runtimeType setup IconUtils.init done, elapsed=${stopwatch.elapsed}');
+ await settings.init(); // <20ms
localMediaCollection.groupFactor = settings.collectionGroupFactor;
localMediaCollection.sortFactor = settings.collectionSortFactor;
+ debugPrint('$runtimeType setup settings.init done, elapsed=${stopwatch.elapsed}');
- await metadataDb.init();
- final currentTimeZone = await FlutterNativeTimezone.getLocalTimezone();
+ await metadataDb.init(); // <20ms
+ final currentTimeZone = await FlutterNativeTimezone.getLocalTimezone(); // <20ms
final catalogTimeZone = settings.catalogTimeZone;
if (currentTimeZone != catalogTimeZone) {
// clear catalog metadata to get correct date/times when moving to a different time zone
+ debugPrint('$runtimeType clear catalog metadata to get correct date/times');
await metadataDb.clearMetadataEntries();
settings.catalogTimeZone = currentTimeZone;
}
+// debugPrint('$runtimeType setup metadataDb.init done, elapsed=${stopwatch.elapsed}');
eventChannel.receiveBroadcastStream().cast