diff --git a/lib/app/states/app.dart b/lib/app/states/app.dart index 6b11cafc..fb3b80fb 100644 --- a/lib/app/states/app.dart +++ b/lib/app/states/app.dart @@ -38,18 +38,14 @@ class AppCubit extends Cubit { selectedIndex = 0; } selectIndex(selectedIndex); - syncHistory(); - } - syncHistory() async { - if (isLoggedIn) { - var history = await service.getUserHistory(1, 200); - for (String videoId in history) { - db.saveProgress(Progress.named(progress: 1, videoId: videoId)); - } + // we only sync the history when the app doesn't run the foreground service + if((db.getSettings(BACKGROUND_NOTIFICATIONS)?.value ?? "false") == "false") { + service.syncHistory(); } } + @override close() async { state.intentDataStreamSubscription.cancel(); diff --git a/lib/foreground_service.dart b/lib/foreground_service.dart index 555eb61e..82dd7f2d 100644 --- a/lib/foreground_service.dart +++ b/lib/foreground_service.dart @@ -73,6 +73,8 @@ onStart(ServiceInstance service) async { await _restartTimer(); }); + // we run the background stuff once when it starts + _backgroundCheck(); _restartTimer(); } @@ -105,6 +107,8 @@ _backgroundCheck() async { sendNotification(title, locals.foregroundServiceUpdatingPlaylist, type: NotificationTypes.foregroundService); await _handlePlaylistNotifications(); sendNotification(title, locals.foregroundServiceNotificationContent(refreshRate), type: NotificationTypes.foregroundService); + + service.syncHistory(); } catch (e) { print('we have a background service error: ${e}'); } finally { diff --git a/lib/l10n/app_or.arb b/lib/l10n/app_or.arb index d5bb1ef2..83280350 100644 --- a/lib/l10n/app_or.arb +++ b/lib/l10n/app_or.arb @@ -1049,7 +1049,7 @@ "@notificationsDescription": { "description": "Setting description for notifications" }, - "playlistNotificationContent": "ଏଠାରେ {count, plural, =0{no new video} =1{1 new video} other{{count} new videos}}ଟି{playlist} playlist} ଭିଡିଓ ଅଛି", + "playlistNotificationContent": "ଏଠାରେ {count, plural, =0{no new video} =1{1 new video} other{{count} new videos}}ଟି{playlist} playlist ଭିଡିଓ ଅଛି", "@playlistNotificationContent": { "description": "Content for playlist notification when there are new videos", "placeholders": { @@ -1087,7 +1087,7 @@ "@deletePlaylistNotificationContent": { "description": "Title for dialog to confirm whether to delete playlist notifications" }, - "channelNotificationContent": "{{count, plural, =0 {no new videos} =1 {1 new video} other {{count} new videos}}ରୁ{channel} ରୁ {count, plural, = 0 {no new videos} = 1 {1 new video}} ଅଛି", + "channelNotificationContent": "ରୁ{channel} ରୁ {count, plural, = 0 {no new videos} = 1 {1 new video} other {{count} new videos}} ଅଛି", "@channelNotificationContent": { "description": "Content for channel notification when there are new videos", "placeholders": { @@ -1133,7 +1133,7 @@ "format": "compact" } }, - "foregroundServiceNotificationContent": "ଥରେ {hours, select, 1 {per hour} 24 {a day} ଅନ୍ୟ {ପ୍ରତ୍ୟେକ {hours} ଘଣ୍ଟା}ନୂତନ ଭିଡିଓଗୁଡିକ ଯାଞ୍ଚ କରିବେ", + "foregroundServiceNotificationContent": "ଥରେ {hours, select, 1 {per hour} 24 {a day} other {ପ୍ରତ୍ୟେକ {hours} ଘଣ୍ଟା}}ନୂତନ ଭିଡିଓଗୁଡିକ ଯାଞ୍ଚ କରିବେ", "@foregroundServiceNotificationContent": { "description": "Content for the foreground service running notification when the user wants to receive notifications", "hours": { diff --git a/lib/player/states/video_player.dart b/lib/player/states/video_player.dart index a89c3cb3..5b551560 100644 --- a/lib/player/states/video_player.dart +++ b/lib/player/states/video_player.dart @@ -320,6 +320,9 @@ class VideoPlayerCubit extends MediaPlayerCubit { fit: fillVideo ? BoxFit.cover : BoxFit.contain, subtitlesConfiguration: BetterPlayerSubtitlesConfiguration( fontSize: settings.state.subtitleSize, + outlineEnabled: true, + outlineColor: Colors.black, + outlineSize: 1 ), controlsConfiguration: BetterPlayerControlsConfiguration(showControls: false // customControlsBuilder: (controller, onPlayerVisibilityChanged) => PlayerControls(mediaPlayerCubit: this), diff --git a/lib/service.dart b/lib/service.dart index d125c4dc..697d576b 100644 --- a/lib/service.dart +++ b/lib/service.dart @@ -14,6 +14,7 @@ import 'package:invidious/search/models/search_sort_by.dart'; import 'package:invidious/search/models/search_type.dart'; import 'package:invidious/settings/models/db/video_filter.dart'; import 'package:invidious/settings/models/errors/invidiousServiceError.dart'; +import 'package:invidious/videos/models/db/progress.dart'; import 'package:invidious/videos/models/dislike.dart'; import 'package:invidious/videos/models/sponsor_segment.dart'; import 'package:invidious/videos/models/userFeed.dart'; @@ -531,6 +532,19 @@ class Service { return List.from(i.map((e) => e as String)); } + void syncHistory() async { + try { + if (db.isLoggedInToCurrentServer()) { + (await getUserHistory(1, 200)).where((element) => db.getVideoProgress(element) == 0).forEach((element) { + db.saveProgress(Progress.named(progress: 1, videoId: element)); + log.fine('updated watch status of $element'); + }); + } + } catch (err) { + log.fine('failed to sync history, probably not logged in'); + } + } + Future clearUserHistory() async { var currentlySelectedServer = db.getCurrentlySelectedServer(); diff --git a/lib/settings/views/screens/notifications.dart b/lib/settings/views/screens/notifications.dart index 7384e715..7f1ddb33 100644 --- a/lib/settings/views/screens/notifications.dart +++ b/lib/settings/views/screens/notifications.dart @@ -72,7 +72,8 @@ class NotificationSettingsScreen extends StatelessWidget { fontSize: 18, fontWeight: FontWeight.w400, )), - Text(locals.notificationFrequencySettingsDescription, style: TextStyle(color: theme.tileDescriptionTextColor)), + Text(locals.notificationFrequencySettingsDescription, + style: TextStyle(color: theme.tileDescriptionTextColor)), Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -83,15 +84,21 @@ class NotificationSettingsScreen extends StatelessWidget { min: 1, max: 24, divisions: 23, - label: locals.notificationFrequencySliderLabel(state.backgroundNotificationFrequency.toString()), - onChanged: (value) => cubit.setBackgroundCheckFrequency(value.toInt()), - onChangeEnd: (value) => cubit.setBackgroundCheckFrequency(value.toInt()), + label: locals.notificationFrequencySliderLabel( + state.backgroundNotificationFrequency.toString()), + onChanged: state.backgroundNotifications + ? (value) => cubit.setBackgroundCheckFrequency(value.toInt()) + : null, + onChangeEnd: state.backgroundNotifications + ? (value) => cubit.setBackgroundCheckFrequency(value.toInt()) + : null, ), ), SizedBox( width: 30, child: Text( - locals.notificationFrequencySliderLabel(state.backgroundNotificationFrequency.toString()), + locals.notificationFrequencySliderLabel( + state.backgroundNotificationFrequency.toString()), ), ) ], @@ -117,7 +124,10 @@ class NotificationSettingsScreen extends StatelessWidget { height: 8, ), Text(locals.otherNotifications), - TabBar(tabs: [Tab(icon: const Icon(Icons.people), text: locals.channels), Tab(icon: const Icon(Icons.playlist_play), text: locals.playlists)]), + TabBar(tabs: [ + Tab(icon: const Icon(Icons.people), text: locals.channels), + Tab(icon: const Icon(Icons.playlist_play), text: locals.playlists) + ]), const Expanded( child: TabBarView( children: [ChannelNotificationList(), PlaylistNotificationList()], diff --git a/lib/videos/models/db/history_video_cache.dart b/lib/videos/models/db/history_video_cache.dart index 46af89bf..586f19de 100644 --- a/lib/videos/models/db/history_video_cache.dart +++ b/lib/videos/models/db/history_video_cache.dart @@ -27,7 +27,7 @@ class HistoryVideoCache { if (cachedVideo == null) { var vid = await service.getVideo(e); cachedVideo = HistoryVideoCache( - vid.videoId, vid.title, vid.author, ImageObject.getWorstThumbnail(vid.videoThumbnails)?.url ?? ''); + vid.videoId, vid.title, vid.author, ImageObject.getBestThumbnail(vid.videoThumbnails)?.url ?? ''); db.upsertHistoryVideo(cachedVideo); } return cachedVideo; diff --git a/lib/videos/views/tv/components/video_item.dart b/lib/videos/views/tv/components/video_item.dart index 994ede01..586c5560 100644 --- a/lib/videos/views/tv/components/video_item.dart +++ b/lib/videos/views/tv/components/video_item.dart @@ -1,8 +1,11 @@ import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:invidious/objectbox.g.dart'; import 'package:invidious/router.dart'; import 'package:invidious/utils.dart'; +import 'package:invidious/videos/states/video_in_list.dart'; import 'package:invidious/videos/views/tv/screens/video.dart'; import '../../../../globals.dart'; @@ -16,12 +19,10 @@ class TvVideoItem extends StatelessWidget { final void Function(bool focus)? onFocusChange; final Function(BuildContext context, VideoInList video)? onSelect; - const TvVideoItem({Key? key, required this.video, required this.autoFocus, this.onSelect, this.onFocusChange}) - : super(key: key); + const TvVideoItem({Key? key, required this.video, required this.autoFocus, this.onSelect, this.onFocusChange}) : super(key: key); openVideo(BuildContext context, VideoInList e, FocusNode node, KeyEvent event) { - if (event is KeyUpEvent && - (event.logicalKey == LogicalKeyboardKey.enter || event.logicalKey == LogicalKeyboardKey.select)) { + if (event is KeyUpEvent && (event.logicalKey == LogicalKeyboardKey.enter || event.logicalKey == LogicalKeyboardKey.select)) { if (onSelect != null) { onSelect!(context, e); } else { @@ -36,78 +37,121 @@ class TvVideoItem extends StatelessWidget { Widget build(BuildContext context) { ColorScheme colors = Theme.of(context).colorScheme; TextTheme textTheme = Theme.of(context).textTheme; - return DefaultTextStyle( - style: textTheme.bodyLarge!, - child: Padding( - padding: const EdgeInsets.only(right: 8.0), - child: Focus( - onFocusChange: onFocusChange, - onKeyEvent: (node, event) => openVideo(context, video, node, event), - autofocus: autoFocus, - child: Builder(builder: (ctx) { - final FocusNode focusNode = Focus.of(ctx); - final bool hasFocus = focusNode.hasFocus; - return GestureDetector( - child: AnimatedScale( - curve: Curves.easeInOutQuad, - duration: animationDuration ~/ 2, - scale: hasFocus ? 1 : 0.9, - child: AnimatedContainer( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15), - color: colors.primaryContainer.withOpacity(hasFocus ? 1 : 0), - ), - duration: animationDuration, - child: AspectRatio( - aspectRatio: 16 / 13, - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - VideoThumbnailView( - videoId: video.videoId, - thumbnailUrl: ImageObject.getBestThumbnail(video.videoThumbnails)?.url ?? '', - child: Padding( - padding: const EdgeInsets.all(8.0), - child: Container( - alignment: Alignment.bottomRight, - child: Container( - decoration: BoxDecoration( - color: Colors.black.withOpacity(0.5), borderRadius: BorderRadius.circular(5)), - child: Padding( - padding: const EdgeInsets.all(3.0), - child: Text( - prettyDuration(Duration(seconds: video.lengthSeconds)), - style: textTheme.bodySmall?.copyWith(color: Colors.white), + return BlocProvider( + create: (context) => VideoInListCubit(VideoInListState(video: video, offlineVideo: null)), + child: BlocBuilder( + builder: (context, _) => DefaultTextStyle( + style: textTheme.bodyLarge!, + child: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Focus( + onFocusChange: onFocusChange, + onKeyEvent: (node, event) => openVideo(context, video, node, event), + autofocus: autoFocus, + child: Builder(builder: (ctx) { + final FocusNode focusNode = Focus.of(ctx); + final bool hasFocus = focusNode.hasFocus; + return GestureDetector( + child: AnimatedScale( + curve: Curves.easeInOutQuad, + duration: animationDuration ~/ 2, + scale: hasFocus ? 1 : 0.9, + child: AnimatedContainer( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: colors.primaryContainer.withOpacity(hasFocus ? 1 : 0), + ), + duration: animationDuration, + child: AspectRatio( + aspectRatio: 16 / 13, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + VideoThumbnailView( + videoId: video.videoId, + thumbnailUrl: ImageObject.getBestThumbnail(video.videoThumbnails)?.url ?? '', + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + alignment: Alignment.bottomRight, + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + if (_.progress > 0.05 && _.progress < 1) + Expanded( + child: Container( + margin: const EdgeInsets.only(right: 8), + alignment: Alignment.centerLeft, + height: 5, + width: double.infinity, + decoration: BoxDecoration( + color: colors.secondaryContainer, + borderRadius: BorderRadius.circular(20), + ), + child: FractionallySizedBox( + widthFactor: _.progress, + heightFactor: 1, + child: Container( + decoration: BoxDecoration( + color: _.progress == 1 ? colors.primaryContainer : colors.primary, + borderRadius: BorderRadius.circular(20), + ), + ), + ), + ), + ), + if (_.progress == 1) + Container( + margin: const EdgeInsets.only(right: 8), + padding: EdgeInsets.all(5), + decoration: BoxDecoration(color: colors.primaryContainer, shape: BoxShape.circle), + child: Icon( + Icons.check, + size: 15, + color: colors.primary, + ), + ), + Container( + decoration: BoxDecoration(color: Colors.black.withOpacity(0.5), borderRadius: BorderRadius.circular(5)), + child: Padding( + padding: const EdgeInsets.all(3.0), + child: Text( + prettyDuration(Duration(seconds: video.lengthSeconds)), + style: textTheme.bodySmall?.copyWith(color: Colors.white), + ), + ), + ), + ], ), ), - ), + )), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Text( + video.title, + maxLines: 2, + overflow: TextOverflow.ellipsis, + style: TextStyle(color: colors.primary), ), - )), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text( - video.title, - maxLines: 2, - overflow: TextOverflow.ellipsis, - style: TextStyle(color: colors.primary), - ), - ), - Padding( - padding: const EdgeInsets.only(left: 8.0), - child: Text( - video.author ?? '', - overflow: TextOverflow.ellipsis, - style: TextStyle(color: colors.secondary), - ), + ), + Padding( + padding: const EdgeInsets.only(left: 8.0), + child: Text( + video.author ?? '', + overflow: TextOverflow.ellipsis, + style: TextStyle(color: colors.secondary), + ), + ), + ], ), - ], - ), - )), - ), - ); - })), + )), + ), + ); + })), + ), + ), ), ); } diff --git a/pubspec.lock b/pubspec.lock index dd7a0fc2..3c3ba3f7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -53,18 +53,18 @@ packages: dependency: "direct main" description: name: audio_service - sha256: "8b719ac7982fdea1a54a528f19e345907295489c53709ba4cdee65a2955c0f4d" + sha256: a4d989f1225ea9621898d60f23236dcbfc04876fa316086c23c5c4af075dbac4 url: "https://pub.dev" source: hosted - version: "0.18.10" + version: "0.18.12" audio_service_platform_interface: dependency: transitive description: name: audio_service_platform_interface - sha256: "2c3a1d52803931e836b9693547a71c0c3585ad54219d2214219ed5cfcc3c1af4" + sha256: "8431a455dac9916cc9ee6f7da5620a666436345c906ad2ebb7fa41d18b3c1bf4" url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "0.1.1" audio_service_web: dependency: transitive description: @@ -101,10 +101,10 @@ packages: dependency: "direct main" description: name: awesome_notifications - sha256: "6ba98d73553c8a54e7b77f8dd8b95ce9d32a7839ef182b28cf2ad54ec28b1821" + sha256: "38119f3d79cbbce304445cb5aca2d8fd55feff3cd4a0303418bf549fa1d37bf3" url: "https://pub.dev" source: hosted - version: "0.7.5-dev.3" + version: "0.7.6" back_button_interceptor: dependency: "direct main" description: @@ -206,26 +206,26 @@ packages: dependency: "direct main" description: name: cached_network_image - sha256: fd3d0dc1d451f9a252b32d95d3f0c3c487bc41a75eba2e6097cb0b9c71491b15 + sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.3.0" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: bb2b8403b4ccdc60ef5f25c70dead1f3d32d24b9d6117cfc087f496b178594a7 + sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "3.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: b8eb814ebfcb4dea049680f8c1ffb2df399e4d03bf7a352c775e26fa06e02fa0 + sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "1.1.0" carousel_slider: dependency: "direct main" description: @@ -382,18 +382,18 @@ packages: dependency: "direct main" description: name: dio - sha256: ce75a1b40947fea0a0e16ce73337122a86762e38b982e1ccb909daa3b9bc4197 + sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7" url: "https://pub.dev" source: hosted - version: "5.3.2" + version: "5.3.3" dynamic_color: dependency: "direct main" description: name: dynamic_color - sha256: de4798a7069121aee12d5895315680258415de9b00e717723a1bd73d58f0126d + sha256: "96bff3df72e3d428bda2b874c7a521e8c86f592cae626ea594922fcc8d166e0c" url: "https://pub.dev" source: hosted - version: "1.6.6" + version: "1.6.7" easy_debounce: dependency: "direct main" description: @@ -495,14 +495,6 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.3" - flutter_blurhash: - dependency: transitive - description: - name: flutter_blurhash - sha256: "05001537bd3fac7644fa6558b09ec8c0a3f2eba78c0765f88912882b1331a5c6" - url: "https://pub.dev" - source: hosted - version: "0.7.0" flutter_cache_manager: dependency: transitive description: @@ -544,10 +536,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4" + sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 url: "https://pub.dev" source: hosted - version: "2.0.2" + version: "2.0.3" flutter_localizations: dependency: "direct main" description: flutter @@ -724,10 +716,10 @@ packages: dependency: "direct main" description: name: just_audio - sha256: "890cd0fc41a1a4530c171e375a2a3fb6a09d84e9d508c5195f40bcff54330327" + sha256: "5ed0cd723e17dfd8cd4b0253726221e67f6546841ea4553635cf895061fc335b" url: "https://pub.dev" source: hosted - version: "0.9.34" + version: "0.9.35" just_audio_platform_interface: dependency: transitive description: @@ -853,10 +845,10 @@ packages: dependency: transitive description: name: octo_image - sha256: "107f3ed1330006a3bea63615e81cf637433f5135a52466c7caa0e7152bca9143" + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "2.0.0" optimize_battery: dependency: "direct main" description: @@ -909,10 +901,10 @@ packages: dependency: "direct main" description: name: path_provider - sha256: "909b84830485dbcd0308edf6f7368bc8fd76afa26a270420f34cabea2a6467a0" + sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" path_provider_android: dependency: transitive description: @@ -973,10 +965,10 @@ packages: dependency: transitive description: name: plugin_platform_interface - sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd" + sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.1.6" pointycastle: dependency: transitive description: @@ -1282,10 +1274,10 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e" + sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27" url: "https://pub.dev" source: hosted - version: "6.1.12" + version: "6.1.14" url_launcher_android: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 9bb59ab4..ade29e31 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.16.2+4031 +version: 1.16.3+4032 environment: sdk: '>=3.0.0 <4.0.0' @@ -35,11 +35,9 @@ dependencies: json_annotation: ^4.8.1 http: 1.1.0 after_layout: 1.2.0 - # video_player: 2.5.1 easy_debounce: 2.0.3 flutter_fadein: 2.0.0 - dynamic_color: 1.6.6 - # chewie: 1.4.0 + dynamic_color: 1.6.7 better_player: git: url: https://github.com/lamarios/betterplayer.git @@ -49,10 +47,10 @@ dependencies: settings_ui: 2.0.2 objectbox: 2.2.1 objectbox_flutter_libs: 2.2.1 - path_provider: 2.1.0 + path_provider: 2.1.1 path: 1.8.3 flutter_web_auth: 0.5.0 - cached_network_image: 3.2.3 + cached_network_image: 3.3.0 share_plus: 7.1.0 package_info_plus: 4.1.0 receive_sharing_intent: 1.4.5 @@ -60,7 +58,7 @@ dependencies: flutter_svg: 2.0.7 flutter_native_splash: 2.3.2 flutter_linkify: 6.0.0 - url_launcher: 6.1.12 + url_launcher: 6.1.14 back_button_interceptor: ^7.0.0 flutter_swipe_action_cell: 3.1.2 device_info_plus: 9.0.3 @@ -69,10 +67,10 @@ dependencies: git: url: https://github.com/lamarios/locale_names.git ref: master - uuid: 3.0.7 - dio: 5.3.2 - just_audio: 0.9.34 - audio_service: 0.18.10 + uuid: ^3.0.7 + dio: 5.3.3 + just_audio: 0.9.35 + audio_service: 0.18.12 carousel_slider: 4.2.1 flutter_animate: 4.2.0+1 bloc: 8.1.2 @@ -82,7 +80,7 @@ dependencies: simple_pip_mode: ^0.8.0 flutter_background_service: 5.0.1 optimize_battery: 0.0.4 - awesome_notifications: ^0.7.5-dev.3 + awesome_notifications: ^0.7.6 auto_route: ^7.8.3 dependency_overrides: # wakelock_windows: @@ -119,7 +117,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^2.0.3 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec