diff --git a/lib/app/connectivity_model.dart b/lib/app/connectivity_model.dart index 58b922fb0..50e86ba90 100644 --- a/lib/app/connectivity_model.dart +++ b/lib/app/connectivity_model.dart @@ -4,6 +4,7 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:safe_change_notifier/safe_change_notifier.dart'; import '../common/data/audio_type.dart'; +import '../extensions/connectivity_x.dart'; import '../player/player_service.dart'; class ConnectivityModel extends SafeChangeNotifier { @@ -34,6 +35,9 @@ class ConnectivityModel extends SafeChangeNotifier { bool get isOnline => _connectivity.isOnline(_result); + bool get isMaybeLowBandWidth => _connectivity.isMaybeLowBandWidth(_result); + + List? get result => _result; List? _result; void _updateConnectivity(List newResult) { if (!_connectivity.isOnline(newResult) && @@ -50,12 +54,3 @@ class ConnectivityModel extends SafeChangeNotifier { super.dispose(); } } - -extension _ConnectivityX on Connectivity { - bool isOnline(List? res) => - res?.contains(ConnectivityResult.ethernet) == true || - res?.contains(ConnectivityResult.bluetooth) == true || - res?.contains(ConnectivityResult.mobile) == true || - res?.contains(ConnectivityResult.vpn) == true || - res?.contains(ConnectivityResult.wifi) == true; -} diff --git a/lib/app/view/mobile_page.dart b/lib/app/view/mobile_page.dart index df7eac9bf..1020c1054 100644 --- a/lib/app/view/mobile_page.dart +++ b/lib/app/view/mobile_page.dart @@ -1,9 +1,12 @@ +import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:watch_it/watch_it.dart'; +import '../../common/view/bandwidth_dialog.dart'; import '../../common/view/snackbars.dart'; import '../../common/view/theme.dart'; import '../../extensions/build_context_x.dart'; +import '../../extensions/connectivity_x.dart'; import '../../player/player_model.dart'; import '../../player/view/full_height_player.dart'; import '../../player/view/player_view.dart'; @@ -11,10 +14,12 @@ import '../../podcasts/download_model.dart'; import '../../podcasts/podcast_model.dart'; import '../../podcasts/podcast_search_state.dart'; import '../../podcasts/view/podcast_snackbar_contents.dart'; +import '../../settings/settings_model.dart'; import '../app_model.dart'; +import '../connectivity_model.dart'; import 'mobile_bottom_bar.dart'; -class MobilePage extends StatelessWidget with WatchItMixin { +class MobilePage extends StatefulWidget with WatchItStatefulWidgetMixin { const MobilePage({ super.key, required this.page, @@ -22,6 +27,27 @@ class MobilePage extends StatelessWidget with WatchItMixin { final Widget page; + @override + State createState() => _MobilePageState(); +} + +class _MobilePageState extends State { + @override + void initState() { + super.initState(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + if (di().notifyDataSafeMode && + di().isMaybeLowBandWidth && + !di().dataSafeMode) { + showDialog( + context: context, + builder: (context) => const BandwidthDialog(), + ); + } + }); + } + @override Widget build(BuildContext context) { final fullWindowMode = @@ -37,6 +63,33 @@ class MobilePage extends StatelessWidget with WatchItMixin { }, ); + final dataSafeMode = watchPropertyValue((PlayerModel m) => m.dataSafeMode); + final notifyDataSafeMode = + watchPropertyValue((SettingsModel m) => m.notifyDataSafeMode); + + registerStreamHandler( + select: (Connectivity m) => m.onConnectivityChanged, + handler: (context, res, cancel) { + if (notifyDataSafeMode && res.hasData) { + if (di().isMaybeLowBandWidth(res.data) && + !dataSafeMode) { + showDialog( + context: context, + builder: (context) => const BandwidthDialog(), + ); + } else if (!di().isMaybeLowBandWidth(res.data) && + dataSafeMode) { + showDialog( + context: context, + builder: (context) => const BandwidthDialog( + backOnBetterConnection: true, + ), + ); + } + } + }, + ); + registerStreamHandler( select: (PodcastModel m) => m.stateStream, initialValue: null, @@ -73,7 +126,7 @@ class MobilePage extends StatelessWidget with WatchItMixin { body: Stack( fit: StackFit.expand, children: [ - page, + widget.page, if (fullWindowMode) Material( color: context.theme.scaffoldBackgroundColor, diff --git a/lib/common/view/bandwidth_dialog.dart b/lib/common/view/bandwidth_dialog.dart new file mode 100644 index 000000000..2207db73b --- /dev/null +++ b/lib/common/view/bandwidth_dialog.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:watch_it/watch_it.dart'; + +import '../../l10n/l10n.dart'; +import '../../player/player_model.dart'; +import '../../settings/settings_model.dart'; +import 'confirm.dart'; + +class BandwidthDialog extends StatelessWidget { + const BandwidthDialog({ + super.key, + this.backOnBetterConnection = false, + }); + + final bool backOnBetterConnection; + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return ConfirmationDialog( + title: Text( + backOnBetterConnection + ? l10n.isBackInWifiDialogTitle + : l10n.isMaybeLowBandwidthDialogTitle, + ), + content: Text( + backOnBetterConnection + ? l10n.isBackInWifiDialogBody + : l10n.isMaybeLowBandwidthDialogBody, + ), + onConfirm: () => + di().setDataSafeMode(!backOnBetterConnection), + cancelLabel: l10n.stopToNotifyAboutDataSafeMode, + onCancel: () => di().setNotifyDataSafeMode(false), + ); + } +} diff --git a/lib/common/view/confirm.dart b/lib/common/view/confirm.dart index 96435f440..61a7c4bc8 100644 --- a/lib/common/view/confirm.dart +++ b/lib/common/view/confirm.dart @@ -18,6 +18,7 @@ class ConfirmationDialog extends StatelessWidget { this.scrollable = false, this.confirmLabel, this.enabled = true, + this.cancelLabel, }); final dynamic Function()? onConfirm; @@ -29,6 +30,7 @@ class ConfirmationDialog extends StatelessWidget { final bool showCloseIcon; final bool scrollable; final String? confirmLabel; + final String? cancelLabel; final bool enabled; @override @@ -65,7 +67,7 @@ class ConfirmationDialog extends StatelessWidget { } } : null, - child: Text(l10n.cancel), + child: Text(cancelLabel ?? l10n.cancel), ), ElevatedButton( onPressed: enabled diff --git a/lib/constants.dart b/lib/constants.dart index ca2b2ca9f..d3052b2c0 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -86,3 +86,4 @@ const kShowPositionDuration = 'showPositionDuration'; const kSettingsPageId = 'settings'; const kHomePageId = 'homePage'; const kPlaybackRate = 'playbackRate'; +const kNotifyDataSafeMode = 'notifyDataSafeMode'; diff --git a/lib/extensions/connectivity_x.dart b/lib/extensions/connectivity_x.dart new file mode 100644 index 000000000..e27f0da62 --- /dev/null +++ b/lib/extensions/connectivity_x.dart @@ -0,0 +1,14 @@ +import 'package:connectivity_plus/connectivity_plus.dart'; + +extension ConnectivityX on Connectivity { + bool isOnline(List? res) => + res?.contains(ConnectivityResult.ethernet) == true || + res?.contains(ConnectivityResult.bluetooth) == true || + res?.contains(ConnectivityResult.mobile) == true || + res?.contains(ConnectivityResult.vpn) == true || + res?.contains(ConnectivityResult.wifi) == true; + + bool isMaybeLowBandWidth(List? res) => + res?.contains(ConnectivityResult.ethernet) == false && + res?.contains(ConnectivityResult.wifi) == false; +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c4c8114cd..e40ae7df0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -184,6 +184,16 @@ "resetAllSettingsConfirm": "Are you absolutely sure to reset all settings, your podcast subscriptions, your podcast progress, your starred stations and your pinned albums? The app will be closed after and you need to re-open it.", "confirm": "Confirm", "confirmation": "Confirmation", + "isMaybeLowBandwidthDialogTitle": "No WIFI/Ethernet", + "isMaybeLowBandwidthDialogBody": "You are not connected to WIFI or Ethernet. Do you want to enable data safe mode?", + "isBackInWifiDialogTitle": "Back in WIFI/Ethernet", + "isBackInWifiDialogBody": "You are connected to WIFI or Ethernet. Do you want to disable data safe mode?", + "enableDataSafeModeSettingTitle": "Data safe mode", + "enableDataSafeModeSettingDescription": "When active the player will not try to download artwork of titles send from radio stations.", + "stopToNotifyAboutDataSafeMode": "Stop to notify me", + "notifyMeAboutDataSafeModeTitle": "Data safe mode notifications", + "notifyMeAboutDataSafeModeDescription": "Notify me about data safe mode", + "resourceSectionTitle": "Device resources", "downloadsOnly": "Downloads only", "downloadsDirectory": "Location of your downloads", "downloadsDirectoryDescription": "Make sure MusicPod can access this directory!", diff --git a/lib/player/player_model.dart b/lib/player/player_model.dart index 3af1ddc31..12bc077ff 100644 --- a/lib/player/player_model.dart +++ b/lib/player/player_model.dart @@ -167,6 +167,9 @@ class PlayerModel extends SafeChangeNotifier { notifyListeners(); } + void setDataSafeMode(bool value) => _playerService.setDataSafeMode(value); + bool get dataSafeMode => _playerService.dataSafeMode; + @override Future dispose() async { await _propertiesChangedSub?.cancel(); diff --git a/lib/player/player_service.dart b/lib/player/player_service.dart index 6368291ca..6f425e1e3 100644 --- a/lib/player/player_service.dart +++ b/lib/player/player_service.dart @@ -759,6 +759,13 @@ class PlayerService { // // Everything related to radio stream icy-title information observed from MPV and digested here // + bool _dataSafeMode = false; + bool get dataSafeMode => _dataSafeMode; + void setDataSafeMode(bool value) { + if (value == _dataSafeMode) return; + _dataSafeMode = value; + _propertiesChangedController.add(true); + } MpvMetaData? _mpvMetaData; MpvMetaData? get mpvMetaData => _mpvMetaData; @@ -773,7 +780,9 @@ class PlayerService { ), ); - await _processParsedIcyTitle(mpvMetaData!.icyTitle); + if (!_dataSafeMode) { + await _processParsedIcyTitle(mpvMetaData!.icyTitle); + } } _propertiesChangedController.add(true); } diff --git a/lib/settings/settings_model.dart b/lib/settings/settings_model.dart index c7387c56b..4cceb428c 100644 --- a/lib/settings/settings_model.dart +++ b/lib/settings/settings_model.dart @@ -86,6 +86,10 @@ class SettingsModel extends SafeChangeNotifier { bool get useMoreAnimations => _service.useMoreAnimations; void setUseMoreAnimations(bool value) => _service.setUseMoreAnimations(value); + bool get notifyDataSafeMode => _service.notifyDataSafeMode; + void setNotifyDataSafeMode(bool value) => + _service.setNotifyDataSafeMode(value); + bool get usePodcastIndex => _service.usePodcastIndex; Future setUsePodcastIndex(bool value) async => _service.setUsePodcastIndex(value); diff --git a/lib/settings/settings_service.dart b/lib/settings/settings_service.dart index 76f50f4e2..170a05d65 100644 --- a/lib/settings/settings_service.dart +++ b/lib/settings/settings_service.dart @@ -75,6 +75,11 @@ class SettingsService { void setUseMoreAnimations(bool value) => _preferences.setBool(kUseMoreAnimations, value).then(notify); + bool get notifyDataSafeMode => + _preferences.getBool(kNotifyDataSafeMode) ?? true; + void setNotifyDataSafeMode(bool value) => + _preferences.setBool(kNotifyDataSafeMode, value).then(notify); + bool recentPatchNotesDisposed(String version) => _preferences.getString(kPatchNotesDisposed) == version; diff --git a/lib/settings/view/resource_section.dart b/lib/settings/view/resource_section.dart new file mode 100644 index 000000000..34cdd1e51 --- /dev/null +++ b/lib/settings/view/resource_section.dart @@ -0,0 +1,56 @@ +import 'package:flutter/material.dart'; +import 'package:watch_it/watch_it.dart'; +import 'package:yaru/yaru.dart'; + +import '../../common/view/common_widgets.dart'; +import '../../common/view/ui_constants.dart'; +import '../../l10n/l10n.dart'; +import '../../player/player_model.dart'; +import '../settings_model.dart'; + +class ResourceSection extends StatelessWidget with WatchItMixin { + const ResourceSection({super.key}); + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return YaruSection( + margin: const EdgeInsets.only( + left: kLargestSpace, + top: kLargestSpace, + right: kLargestSpace, + ), + headline: Text(l10n.resourceSectionTitle), + child: Column( + children: [ + YaruTile( + title: Text(l10n.useMoreAnimationsTitle), + subtitle: Text(l10n.useMoreAnimationsDescription), + trailing: CommonSwitch( + onChanged: di().setUseMoreAnimations, + value: + watchPropertyValue((SettingsModel m) => m.useMoreAnimations), + ), + ), + YaruTile( + title: Text(l10n.enableDataSafeModeSettingTitle), + subtitle: Text(l10n.enableDataSafeModeSettingDescription), + trailing: CommonSwitch( + onChanged: di().setDataSafeMode, + value: watchPropertyValue((PlayerModel m) => m.dataSafeMode), + ), + ), + YaruTile( + title: Text(l10n.notifyMeAboutDataSafeModeTitle), + subtitle: Text(l10n.notifyMeAboutDataSafeModeDescription), + trailing: CommonSwitch( + onChanged: di().setNotifyDataSafeMode, + value: + watchPropertyValue((SettingsModel m) => m.notifyDataSafeMode), + ), + ), + ], + ), + ); + } +} diff --git a/lib/settings/view/settings_page.dart b/lib/settings/view/settings_page.dart index b7658f8fd..006ca5304 100644 --- a/lib/settings/view/settings_page.dart +++ b/lib/settings/view/settings_page.dart @@ -11,6 +11,7 @@ import 'expose_online_section.dart'; import 'local_audio_section.dart'; import 'podcast_section.dart'; import 'reset_section.dart'; +import 'resource_section.dart'; import 'theme_section.dart'; class SettingsPage extends StatelessWidget { @@ -25,6 +26,7 @@ class SettingsPage extends StatelessWidget { PodcastSection(), LocalAudioSection(), ExposeOnlineSection(), + ResourceSection(), ResetSection(), AboutSection(), ], diff --git a/lib/settings/view/theme_section.dart b/lib/settings/view/theme_section.dart index 2b8649870..0606001c5 100644 --- a/lib/settings/view/theme_section.dart +++ b/lib/settings/view/theme_section.dart @@ -58,15 +58,6 @@ class ThemeSection extends StatelessWidget with WatchItMixin { ), ), ), - YaruTile( - title: Text(l10n.useMoreAnimationsTitle), - subtitle: Text(l10n.useMoreAnimationsDescription), - trailing: CommonSwitch( - onChanged: di().setUseMoreAnimations, - value: - watchPropertyValue((SettingsModel m) => m.useMoreAnimations), - ), - ), YaruTile( title: Text(l10n.showPositionDurationTitle), subtitle: Text(l10n.showPositionDurationDescription), diff --git a/needs_translation.json b/needs_translation.json index 2a62451e2..f0f366fd8 100644 --- a/needs_translation.json +++ b/needs_translation.json @@ -10,6 +10,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsDirectory", "downloadsDirectoryDescription", "downloadsChangeWarning", @@ -318,6 +328,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsDirectory", "downloadsDirectoryDescription", "downloadsChangeWarning", @@ -621,6 +641,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "exposeToListenBrainzSubTitle" ], @@ -629,7 +659,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "et": [ @@ -637,7 +677,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "eu": [ @@ -645,7 +695,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "fr": [ @@ -653,7 +713,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "it": [ @@ -661,7 +731,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "nl": [ @@ -683,6 +763,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsChangeWarning", "moreOptions", "noRadioServerFound", @@ -1152,6 +1242,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsDirectory", "downloadsDirectoryDescription", "downloadsChangeWarning", @@ -1436,6 +1536,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsOnly", "downloadsDirectory", "downloadsDirectoryDescription", @@ -1934,6 +2044,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsOnly", "downloadsDirectory", "downloadsDirectoryDescription", @@ -2385,6 +2505,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "clicks", "regionAruba", "regionAustralia", @@ -2630,7 +2760,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "sv": [ @@ -2638,7 +2778,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "ta": [ @@ -2646,7 +2796,17 @@ "resetAllSettings", "resetAllSettingsConfirm", "confirm", - "confirmation" + "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle" ], "tr": [ @@ -2660,6 +2820,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsDirectory", "downloadsDirectoryDescription", "downloadsChangeWarning", @@ -2966,6 +3136,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "useMoreAnimationsTitle", "useMoreAnimationsDescription", "showPositionDurationTitle", @@ -2993,6 +3173,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsDirectory", "downloadsDirectoryDescription", "downloadsChangeWarning", @@ -3292,6 +3482,16 @@ "resetAllSettingsConfirm", "confirm", "confirmation", + "isMaybeLowBandwidthDialogTitle", + "isMaybeLowBandwidthDialogBody", + "isBackInWifiDialogTitle", + "isBackInWifiDialogBody", + "enableDataSafeModeSettingTitle", + "enableDataSafeModeSettingDescription", + "stopToNotifyAboutDataSafeMode", + "notifyMeAboutDataSafeModeTitle", + "notifyMeAboutDataSafeModeDescription", + "resourceSectionTitle", "downloadsDirectory", "downloadsDirectoryDescription", "downloadsChangeWarning",