#100 revert package fetch in setup, use keys to refresh instead
This commit is contained in:
parent
4e441e8491
commit
43635df075
7 changed files with 20 additions and 14 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Reference in a new issue