diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index ca5cb15..cb43eb9 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -186,7 +186,7 @@ class _AnimeStreamPageState extends riv.ConsumerState bool _hasEndingSkip = false; bool _initSubtitleAndAudio = true; - late final StreamSubscription _currentPositionSub = + late StreamSubscription _currentPositionSub = _player.stream.position.listen( (position) async { _isCompleted.value = @@ -240,7 +240,29 @@ class _AnimeStreamPageState extends riv.ConsumerState } } - bool isFFF = false; + void _setCurrentAudSub() { + _initSubtitleAndAudio = true; + _currentPositionSub = _player.stream.position.listen( + (position) async { + _isCompleted.value = _player.state.duration.inSeconds - + _currentPosition.value.inSeconds <= + 10; + _currentPosition.value = position; + if (_initSubtitleAndAudio) { + final subtitle = _player.state.track.subtitle; + try { + _player.setSubtitleTrack(subtitle); + } catch (_) {} + try { + final audio = _player.state.track.audio; + _player.setAudioTrack(audio); + } catch (_) {} + } + _initSubtitleAndAudio = false; + }, + ); + } + @override void initState() { _currentPositionSub; @@ -400,6 +422,7 @@ class _AnimeStreamPageState extends riv.ConsumerState httpHeaders: quality.headers, start: _currentPosition.value)); } + _setCurrentAudSub(); Navigator.pop(context); }, ); diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index d5baa42..fa6bda3 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -239,21 +239,14 @@ Widget _extensionUpdateNumbers(WidgetRef ref, ItemType itemType) { compareVersions(element.version!, element.versionLast!) < 0) .toList(); return entries.isEmpty - ? Container() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(20), - color: Theme.of(context).focusColor), - child: Padding( - padding: const EdgeInsets.all(5), - child: Text( - entries.length.toString(), - style: TextStyle( - fontSize: 12, - color: Theme.of(context).textTheme.bodySmall!.color), - ), - ), - ); + ? SizedBox.shrink() + : Badge( + backgroundColor: Theme.of(context).focusColor, + label: Text( + entries.length.toString(), + style: TextStyle( + color: Theme.of(context).textTheme.bodySmall!.color), + )); } return Container(); }); diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index 94e62e4..3b28823 100644 --- a/lib/modules/main_view/providers/migration.g.dart +++ b/lib/modules/main_view/providers/migration.g.dart @@ -6,7 +6,7 @@ part of 'migration.dart'; // RiverpodGenerator // ************************************************************************** -String _$migrationHash() => r'7354a8368b73fdfcfd284848b9837b4bc9047e7f'; +String _$migrationHash() => r'd4ebb16320d44b90ca9532f10e8128b9ee8ab52d'; /// See also [migration]. @ProviderFor(migration) diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index b842e0c..d7826c8 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -227,9 +227,33 @@ class _UpdatesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - if (!hideManga) Tab(text: l10n.manga), - if (!hideAnime) Tab(text: l10n.anime), - if (!hideNovel) Tab(text: l10n.novel), + if (!hideManga) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Tab(text: l10n.manga), + const SizedBox(width: 8), + _updateNumbers(ref, ItemType.manga) + ], + ), + if (!hideAnime) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Tab(text: l10n.anime), + const SizedBox(width: 8), + _updateNumbers(ref, ItemType.anime) + ], + ), + if (!hideNovel) + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Tab(text: l10n.novel), + const SizedBox(width: 8), + _updateNumbers(ref, ItemType.novel) + ], + ), ], ), ), @@ -373,3 +397,28 @@ class _UpdateTabState extends ConsumerState { )); } } + +Widget _updateNumbers(WidgetRef ref, ItemType itemType) { + return StreamBuilder( + stream: isar.updates + .filter() + .idIsNotNull() + .and() + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) + .watch(fireImmediately: true), + builder: (context, snapshot) { + if (snapshot.hasData && snapshot.data!.isNotEmpty) { + final entries = snapshot.data!.toList(); + return entries.isEmpty + ? SizedBox.shrink() + : Badge( + backgroundColor: Theme.of(context).focusColor, + label: Text( + entries.length.toString(), + style: TextStyle( + color: Theme.of(context).textTheme.bodySmall!.color), + )); + } + return Container(); + }); +} diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index c05db92..b2e1def 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; +String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/fetch_anime_sources.dart b/lib/services/fetch_anime_sources.dart index 574b143..ae98fb2 100644 --- a/lib/services/fetch_anime_sources.dart +++ b/lib/services/fetch_anime_sources.dart @@ -5,7 +5,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'fetch_anime_sources.g.dart'; -@riverpod +@Riverpod(keepAlive: true) Future fetchAnimeSourcesList(Ref ref, {int? id, required bool reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { await fetchSourcesList( diff --git a/lib/services/fetch_anime_sources.g.dart b/lib/services/fetch_anime_sources.g.dart index 3c1c4e6..ad3e5c6 100644 --- a/lib/services/fetch_anime_sources.g.dart +++ b/lib/services/fetch_anime_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart'; // ************************************************************************** String _$fetchAnimeSourcesListHash() => - r'75185e008e90491987fabb55851c536de89653a4'; + r'34db8fac67fb2d445645e62adc68b6d13d481897'; /// Copied from Dart SDK class _SystemHash { @@ -76,7 +76,7 @@ class FetchAnimeSourcesListFamily extends Family { } /// See also [fetchAnimeSourcesList]. -class FetchAnimeSourcesListProvider extends AutoDisposeFutureProvider { +class FetchAnimeSourcesListProvider extends FutureProvider { /// See also [fetchAnimeSourcesList]. FetchAnimeSourcesListProvider({ int? id, @@ -134,7 +134,7 @@ class FetchAnimeSourcesListProvider extends AutoDisposeFutureProvider { } @override - AutoDisposeFutureProviderElement createElement() { + FutureProviderElement createElement() { return _FetchAnimeSourcesListProviderElement(this); } @@ -157,7 +157,7 @@ class FetchAnimeSourcesListProvider extends AutoDisposeFutureProvider { @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -mixin FetchAnimeSourcesListRef on AutoDisposeFutureProviderRef { +mixin FetchAnimeSourcesListRef on FutureProviderRef { /// The parameter `id` of this provider. int? get id; @@ -166,8 +166,7 @@ mixin FetchAnimeSourcesListRef on AutoDisposeFutureProviderRef { } class _FetchAnimeSourcesListProviderElement - extends AutoDisposeFutureProviderElement - with FetchAnimeSourcesListRef { + extends FutureProviderElement with FetchAnimeSourcesListRef { _FetchAnimeSourcesListProviderElement(super.provider); @override diff --git a/lib/services/fetch_manga_sources.dart b/lib/services/fetch_manga_sources.dart index 99265cc..ecb333c 100644 --- a/lib/services/fetch_manga_sources.dart +++ b/lib/services/fetch_manga_sources.dart @@ -5,7 +5,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'fetch_manga_sources.g.dart'; -@riverpod +@Riverpod(keepAlive: true) Future fetchMangaSourcesList(Ref ref, {int? id, required reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { await fetchSourcesList( diff --git a/lib/services/fetch_manga_sources.g.dart b/lib/services/fetch_manga_sources.g.dart index 6bf219e..201999c 100644 --- a/lib/services/fetch_manga_sources.g.dart +++ b/lib/services/fetch_manga_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart'; // ************************************************************************** String _$fetchMangaSourcesListHash() => - r'f66f3011e72a3b234d7729ef203fc5f255870db3'; + r'b56d2a229f2d0a2ef4dc93d9f06cc8485dcd2285'; /// Copied from Dart SDK class _SystemHash { @@ -76,7 +76,7 @@ class FetchMangaSourcesListFamily extends Family { } /// See also [fetchMangaSourcesList]. -class FetchMangaSourcesListProvider extends AutoDisposeFutureProvider { +class FetchMangaSourcesListProvider extends FutureProvider { /// See also [fetchMangaSourcesList]. FetchMangaSourcesListProvider({ int? id, @@ -134,7 +134,7 @@ class FetchMangaSourcesListProvider extends AutoDisposeFutureProvider { } @override - AutoDisposeFutureProviderElement createElement() { + FutureProviderElement createElement() { return _FetchMangaSourcesListProviderElement(this); } @@ -157,7 +157,7 @@ class FetchMangaSourcesListProvider extends AutoDisposeFutureProvider { @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -mixin FetchMangaSourcesListRef on AutoDisposeFutureProviderRef { +mixin FetchMangaSourcesListRef on FutureProviderRef { /// The parameter `id` of this provider. int? get id; @@ -166,8 +166,7 @@ mixin FetchMangaSourcesListRef on AutoDisposeFutureProviderRef { } class _FetchMangaSourcesListProviderElement - extends AutoDisposeFutureProviderElement - with FetchMangaSourcesListRef { + extends FutureProviderElement with FetchMangaSourcesListRef { _FetchMangaSourcesListProviderElement(super.provider); @override diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart index 13b33a8..9b8533c 100644 --- a/lib/services/fetch_novel_sources.dart +++ b/lib/services/fetch_novel_sources.dart @@ -5,7 +5,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'fetch_novel_sources.g.dart'; -@riverpod +@Riverpod(keepAlive: true) Future fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { await fetchSourcesList( diff --git a/lib/services/fetch_novel_sources.g.dart b/lib/services/fetch_novel_sources.g.dart index e9c72a2..09baf0d 100644 --- a/lib/services/fetch_novel_sources.g.dart +++ b/lib/services/fetch_novel_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_novel_sources.dart'; // ************************************************************************** String _$fetchNovelSourcesListHash() => - r'1444d9ca12204ccf5389efe085c8a20e3498a808'; + r'9a7afa9c301d2f4be51c074e5a81117f6d01352a'; /// Copied from Dart SDK class _SystemHash { @@ -76,7 +76,7 @@ class FetchNovelSourcesListFamily extends Family { } /// See also [fetchNovelSourcesList]. -class FetchNovelSourcesListProvider extends AutoDisposeFutureProvider { +class FetchNovelSourcesListProvider extends FutureProvider { /// See also [fetchNovelSourcesList]. FetchNovelSourcesListProvider({ int? id, @@ -134,7 +134,7 @@ class FetchNovelSourcesListProvider extends AutoDisposeFutureProvider { } @override - AutoDisposeFutureProviderElement createElement() { + FutureProviderElement createElement() { return _FetchNovelSourcesListProviderElement(this); } @@ -157,7 +157,7 @@ class FetchNovelSourcesListProvider extends AutoDisposeFutureProvider { @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element -mixin FetchNovelSourcesListRef on AutoDisposeFutureProviderRef { +mixin FetchNovelSourcesListRef on FutureProviderRef { /// The parameter `id` of this provider. int? get id; @@ -166,8 +166,7 @@ mixin FetchNovelSourcesListRef on AutoDisposeFutureProviderRef { } class _FetchNovelSourcesListProviderElement - extends AutoDisposeFutureProviderElement - with FetchNovelSourcesListRef { + extends FutureProviderElement with FetchNovelSourcesListRef { _FetchNovelSourcesListProviderElement(super.provider); @override diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index 834afd6..558da2c 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'ddd07acc8d28d2aa95c942566109e9393ca9e5ed'; +String _$anilistHash() => r'70e8cd537270a9054a1ef72de117fc7ad5545218'; /// Copied from Dart SDK class _SystemHash {