diff --git a/lib/main.dart b/lib/main.dart index 6f8516a..e01ef0f 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,6 +14,7 @@ import 'package:package_info_plus/package_info_plus.dart'; import 'package:path/path.dart' as path; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import 'package:smtc_windows/smtc_windows.dart' if (dart.library.html) 'package:fladder/stubs/web/smtc_web.dart'; import 'package:universal_html/html.dart' as html; import 'package:window_manager/window_manager.dart'; @@ -33,6 +34,7 @@ import 'package:fladder/theme.dart'; import 'package:fladder/util/adaptive_layout.dart'; import 'package:fladder/util/application_info.dart'; import 'package:fladder/util/fladder_config.dart'; +import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/util/string_extensions.dart'; import 'package:fladder/util/themes_data.dart'; @@ -54,6 +56,10 @@ void main() async { WidgetsFlutterBinding.ensureInitialized(); final crashProvider = CrashLogNotifier(); + if (defaultTargetPlatform == TargetPlatform.windows) { + await SMTCWindows.initialize(); + } + if (kIsWeb) { html.document.onContextMenu.listen((event) => event.preventDefault()); final result = await loadConfig(); @@ -288,7 +294,7 @@ class _MainState extends ConsumerState
with WindowListener, WidgetsBinding (element) => element.languageCode == language.languageCode, orElse: () => const Locale('en', "GB"), ), - child: ScaffoldMessenger(child: child ?? Container()), + child: LocalizationContextWrapper(child: ScaffoldMessenger(child: child ?? Container())), ), debugShowCheckedModeBanner: false, darkTheme: darkTheme.copyWith( @@ -302,7 +308,6 @@ class _MainState extends ConsumerState
with WindowListener, WidgetsBinding ), themeMode: themeMode, routerConfig: autoRouter.config(), - // routerConfig: AdaptiveLayout.routerOf(context).config(), ), ); }), @@ -310,6 +315,4 @@ class _MainState extends ConsumerState
with WindowListener, WidgetsBinding } } -final currentTitleProvider = StateProvider((ref) { - return "Fladder"; -}); +final currentTitleProvider = StateProvider((ref) => "Fladder"); diff --git a/lib/screens/shared/media/season_row.dart b/lib/screens/shared/media/season_row.dart index d9e84bc..73c817f 100644 --- a/lib/screens/shared/media/season_row.dart +++ b/lib/screens/shared/media/season_row.dart @@ -156,10 +156,7 @@ class SeasonPoster extends ConsumerWidget { alignment: Alignment.bottomRight, child: PopupMenuButton( tooltip: context.localized.options, - icon: Icon( - Icons.more_vert, - color: Colors.white, - ), + icon: const Icon(Icons.more_vert, color: Colors.white), itemBuilder: (context) => season.generateActions(context, ref).popupMenuItems(useIcons: true), ), ), diff --git a/lib/stubs/web/smtc_web.dart b/lib/stubs/web/smtc_web.dart index 85d3076..c0ecdcb 100644 --- a/lib/stubs/web/smtc_web.dart +++ b/lib/stubs/web/smtc_web.dart @@ -14,6 +14,8 @@ class SMTCWindows { bool? enabled, }); + static Future initialize() async {} + late final Stream buttonPressStream; Future updateConfig(SMTCConfig config) async {} diff --git a/lib/util/localization_helper.dart b/lib/util/localization_helper.dart index 6448f52..eda6922 100644 --- a/lib/util/localization_helper.dart +++ b/lib/util/localization_helper.dart @@ -1,6 +1,32 @@ import 'package:flutter/material.dart'; + import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +///Only use for base translations, under normal circumstances ALWAYS use the widgets provided context +final localizationContextProvider = StateProvider((ref) => null); extension BuildContextExtension on BuildContext { AppLocalizations get localized => AppLocalizations.of(this); } + +class LocalizationContextWrapper extends ConsumerStatefulWidget { + final Widget child; + const LocalizationContextWrapper({required this.child, super.key}); + + @override + ConsumerState createState() => _LocalizationContextWrapperState(); +} + +class _LocalizationContextWrapperState extends ConsumerState { + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((event) { + ref.read(localizationContextProvider.notifier).update((cb) => context); + }); + } + + @override + Widget build(BuildContext context) => widget.child; +} diff --git a/lib/wrappers/media_control_wrapper.dart b/lib/wrappers/media_control_wrapper.dart index 7b5cfa6..c480dd5 100644 --- a/lib/wrappers/media_control_wrapper.dart +++ b/lib/wrappers/media_control_wrapper.dart @@ -16,6 +16,7 @@ import 'package:fladder/models/settings/video_player_settings.dart'; import 'package:fladder/providers/settings/client_settings_provider.dart'; import 'package:fladder/providers/settings/video_player_settings_provider.dart'; import 'package:fladder/providers/video_player_provider.dart'; +import 'package:fladder/util/localization_helper.dart'; import 'package:fladder/wrappers/players/base_player.dart'; import 'package:fladder/wrappers/players/lib_mdk.dart' if (dart.library.html) 'package:fladder/stubs/web/lib_mdk_web.dart'; @@ -211,10 +212,12 @@ class MediaControlsWrapper extends BaseAudioHandler { Future windowSMTCSetup(ItemBaseModel playBackItem, Duration currentPosition) async { final poster = playBackItem.images?.firstOrNull; + final mainContext = ref.read(localizationContextProvider); //Windows setup smtc?.updateMetadata(MusicMetadata( title: playBackItem.title, + artist: mainContext != null ? playBackItem.label(mainContext) : null, thumbnail: poster?.path, )); smtc?.updateTimeline(