#100 revert package fetch in setup, use keys to refresh instead

This commit is contained in:
Thibault Deckers 2021-10-09 13:55:17 +09:00
parent 4e441e8491
commit 43635df075
7 changed files with 20 additions and 14 deletions

View file

@ -98,7 +98,6 @@ class SqfliteMetadataDb implements MetadataDb {
@override @override
Future<void> init() async { Future<void> init() async {
debugPrint('$runtimeType init');
_database = openDatabase( _database = openDatabase(
await path, await path,
onCreate: (db, version) async { onCreate: (db, version) async {

View file

@ -70,9 +70,7 @@ abstract class CollectionSource with SourceBase, AlbumMixin, LocationMixin, TagM
late Map<int?, int?> _savedDates; late Map<int?, int?> _savedDates;
Future<void> loadDates() async { Future<void> loadDates() async {
final stopwatch = Stopwatch()..start();
_savedDates = Map.unmodifiable(await metadataDb.loadDates()); _savedDates = Map.unmodifiable(await metadataDb.loadDates());
debugPrint('$runtimeType loadDates complete in ${stopwatch.elapsed.inMilliseconds}ms for ${_savedDates.length} entries');
} }
Iterable<AvesEntry> _applyHiddenFilters(Iterable<AvesEntry> entries) { Iterable<AvesEntry> _applyHiddenFilters(Iterable<AvesEntry> entries) {

View file

@ -38,7 +38,7 @@ class MediaStoreSource extends CollectionSource {
} }
await loadDates(); await loadDates();
_initialized = true; _initialized = true;
debugPrint('$runtimeType init done, elapsed=${stopwatch.elapsed}'); debugPrint('$runtimeType init complete in ${stopwatch.elapsed.inMilliseconds}ms');
} }
@override @override

View file

@ -1,5 +1,4 @@
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:aves/utils/change_notifier.dart';
import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
@ -15,7 +14,7 @@ class AndroidFileUtils {
List<String> _potentialAppDirs = []; List<String> _potentialAppDirs = [];
bool _initialized = false; bool _initialized = false;
AChangeNotifier appNameChangeNotifier = AChangeNotifier(); ValueNotifier<bool> areAppNamesReadyNotifier = ValueNotifier(false);
Iterable<Package> get _launcherPackages => _packages.where((package) => package.categoryLauncher); Iterable<Package> get _launcherPackages => _packages.where((package) => package.categoryLauncher);
@ -35,15 +34,15 @@ class AndroidFileUtils {
// from Aves // from Aves
videoCapturesPath = pContext.join(dcimPath, 'Video Captures'); videoCapturesPath = pContext.join(dcimPath, 'Video Captures');
// include package fetching in initialization _initialized = true;
// to avoid app album color flickering }
Future<void> initAppNames() async {
if (_packages.isEmpty) { if (_packages.isEmpty) {
_packages = await androidAppService.getPackages(); _packages = await androidAppService.getPackages();
_potentialAppDirs = _launcherPackages.expand((package) => package.potentialDirs).toList(); _potentialAppDirs = _launcherPackages.expand((package) => package.potentialDirs).toList();
appNameChangeNotifier.notifyListeners(); areAppNamesReadyNotifier.value = true;
} }
_initialized = true;
} }
bool isCameraPath(String path) => path.startsWith(dcimPath) && (path.endsWith('${separator}Camera') || path.endsWith('${separator}100ANDRO')); bool isCameraPath(String path) => path.startsWith(dcimPath) && (path.endsWith('${separator}Camera') || path.endsWith('${separator}100ANDRO'));

View file

@ -32,9 +32,9 @@ class AlbumListPage extends StatelessWidget {
return !(eq.equals(t1.item1, t2.item1) && eq.equals(t1.item2, t2.item2) && eq.equals(t1.item3, t2.item3)); return !(eq.equals(t1.item1, t2.item1) && eq.equals(t1.item2, t2.item2) && eq.equals(t1.item3, t2.item3));
}, },
builder: (context, s, child) { builder: (context, s, child) {
return AnimatedBuilder( return ValueListenableBuilder<bool>(
animation: androidFileUtils.appNameChangeNotifier, valueListenable: androidFileUtils.areAppNamesReadyNotifier,
builder: (context, child) => StreamBuilder( builder: (context, areAppNamesReady, child) => StreamBuilder(
stream: source.eventBus.on<AlbumsChangedEvent>(), stream: source.eventBus.on<AlbumsChangedEvent>(),
builder: (context, snapshot) { builder: (context, snapshot) {
final gridItems = getAlbumGridItems(context, source); final gridItems = getAlbumGridItems(context, source);

View file

@ -96,7 +96,14 @@ class CoveredFilterChip<T extends CollectionFilter> extends StatelessWidget {
Widget _buildChip(BuildContext context, CollectionSource source) { Widget _buildChip(BuildContext context, CollectionSource source) {
final entry = coverEntry ?? source.coverEntry(filter); final entry = coverEntry ?? source.coverEntry(filter);
final titlePadding = min<double>(4.0, extent / 32); final titlePadding = min<double>(4.0, extent / 32);
Key? chipKey;
if (filter is AlbumFilter) {
// when we asynchronously fetch installed app names,
// album filters themselves do not change, but decoration derived from it does
chipKey = ValueKey(androidFileUtils.areAppNamesReadyNotifier.value);
}
return AvesFilterChip( return AvesFilterChip(
key: chipKey,
filter: filter, filter: filter,
showGenericIcon: false, showGenericIcon: false,
decoration: AvesFilterDecoration( decoration: AvesFilterDecoration(

View file

@ -55,6 +55,7 @@ class _HomePageState extends State<HomePage> {
Widget build(BuildContext context) => const Scaffold(); Widget build(BuildContext context) => const Scaffold();
Future<void> _setup() async { Future<void> _setup() async {
final stopwatch = Stopwatch()..start();
final permissions = await [ final permissions = await [
Permission.storage, Permission.storage,
// to access media with unredacted metadata with scoped storage (Android 10+) // to access media with unredacted metadata with scoped storage (Android 10+)
@ -66,6 +67,7 @@ class _HomePageState extends State<HomePage> {
} }
await androidFileUtils.init(); await androidFileUtils.init();
unawaited(androidFileUtils.initAppNames());
var appMode = AppMode.main; var appMode = AppMode.main;
final intentData = widget.intentData ?? await ViewerService.getIntentData(); final intentData = widget.intentData ?? await ViewerService.getIntentData();
@ -107,6 +109,7 @@ class _HomePageState extends State<HomePage> {
unawaited(reportService.setCustomKey('app_mode', appMode.toString())); unawaited(reportService.setCustomKey('app_mode', appMode.toString()));
if (appMode != AppMode.view) { if (appMode != AppMode.view) {
debugPrint('Storage check complete in ${stopwatch.elapsed.inMilliseconds}ms');
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();
await source.init(); await source.init();
unawaited(source.refresh()); unawaited(source.refresh());