mirror of
https://github.com/localsend/localsend.git
synced 2026-04-29 03:00:23 -04:00
add discovery timeout setting (#1304)
This commit is contained in:
@@ -123,6 +123,7 @@
|
||||
"deviceType": "Device type",
|
||||
"deviceModel": "Device model",
|
||||
"port": "Port",
|
||||
"discoveryTimeout": "Discovery Timeout",
|
||||
"portWarning": "You might not be detected by other devices because you are using a custom port. (default: {defaultPort})",
|
||||
"encryption": "Encryption",
|
||||
"multicastGroup": "Multicast",
|
||||
|
||||
@@ -606,6 +606,7 @@ class _StringsSettingsTabNetworkEn {
|
||||
String get deviceType => 'Device type';
|
||||
String get deviceModel => 'Device model';
|
||||
String get port => 'Port';
|
||||
String get discoveryTimeout => 'Discovery Timeout';
|
||||
String portWarning({required Object defaultPort}) => 'You might not be detected by other devices because you are using a custom port. (default: ${defaultPort})';
|
||||
String get encryption => 'Encryption';
|
||||
String get multicastGroup => 'Multicast';
|
||||
|
||||
@@ -530,6 +530,7 @@ class _StringsSettingsTabNetworkZhCn extends _StringsSettingsTabNetworkEn {
|
||||
@override String get deviceType => '设备类型';
|
||||
@override String get deviceModel => '设备型号';
|
||||
@override String get port => '端口';
|
||||
@override String get discoveryTimeout => '发现超时';
|
||||
@override String portWarning({required Object defaultPort}) => '由于正在使用自定义端口,你可能不会被其他设备检测到。(默认端口:${defaultPort})';
|
||||
@override String get encryption => '加密';
|
||||
@override String get multicastGroup => '多播';
|
||||
|
||||
@@ -31,6 +31,7 @@ class SettingsState with SettingsStateMappable {
|
||||
final DeviceType? deviceType;
|
||||
final String? deviceModel;
|
||||
final bool shareViaLinkAutoAccept;
|
||||
final int discoveryTimeout;
|
||||
|
||||
const SettingsState({
|
||||
required this.showToken,
|
||||
@@ -55,5 +56,6 @@ class SettingsState with SettingsStateMappable {
|
||||
required this.deviceType,
|
||||
required this.deviceModel,
|
||||
required this.shareViaLinkAutoAccept,
|
||||
required this.discoveryTimeout,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -65,6 +65,8 @@ class SettingsStateMapper extends ClassMapperBase<SettingsState> {
|
||||
static const Field<SettingsState, String> _f$deviceModel = Field('deviceModel', _$deviceModel);
|
||||
static bool _$shareViaLinkAutoAccept(SettingsState v) => v.shareViaLinkAutoAccept;
|
||||
static const Field<SettingsState, bool> _f$shareViaLinkAutoAccept = Field('shareViaLinkAutoAccept', _$shareViaLinkAutoAccept);
|
||||
static int _$discoveryTimeout(SettingsState v) => v.discoveryTimeout;
|
||||
static const Field<SettingsState, int> _f$discoveryTimeout = Field('discoveryTimeout', _$discoveryTimeout);
|
||||
|
||||
@override
|
||||
final MappableFields<SettingsState> fields = const {
|
||||
@@ -90,6 +92,7 @@ class SettingsStateMapper extends ClassMapperBase<SettingsState> {
|
||||
#deviceType: _f$deviceType,
|
||||
#deviceModel: _f$deviceModel,
|
||||
#shareViaLinkAutoAccept: _f$shareViaLinkAutoAccept,
|
||||
#discoveryTimeout: _f$discoveryTimeout,
|
||||
};
|
||||
|
||||
static SettingsState _instantiate(DecodingData data) {
|
||||
@@ -115,7 +118,8 @@ class SettingsStateMapper extends ClassMapperBase<SettingsState> {
|
||||
enableAnimations: data.dec(_f$enableAnimations),
|
||||
deviceType: data.dec(_f$deviceType),
|
||||
deviceModel: data.dec(_f$deviceModel),
|
||||
shareViaLinkAutoAccept: data.dec(_f$shareViaLinkAutoAccept));
|
||||
shareViaLinkAutoAccept: data.dec(_f$shareViaLinkAutoAccept),
|
||||
discoveryTimeout: data.dec(_f$discoveryTimeout));
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -185,7 +189,8 @@ abstract class SettingsStateCopyWith<$R, $In extends SettingsState, $Out> implem
|
||||
bool? enableAnimations,
|
||||
DeviceType? deviceType,
|
||||
String? deviceModel,
|
||||
bool? shareViaLinkAutoAccept});
|
||||
bool? shareViaLinkAutoAccept,
|
||||
int? discoveryTimeout});
|
||||
SettingsStateCopyWith<$R2, $In, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t);
|
||||
}
|
||||
|
||||
@@ -218,7 +223,8 @@ class _SettingsStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Setting
|
||||
bool? enableAnimations,
|
||||
Object? deviceType = $none,
|
||||
Object? deviceModel = $none,
|
||||
bool? shareViaLinkAutoAccept}) =>
|
||||
bool? shareViaLinkAutoAccept,
|
||||
int? discoveryTimeout}) =>
|
||||
$apply(FieldCopyWithData({
|
||||
if (showToken != null) #showToken: showToken,
|
||||
if (alias != null) #alias: alias,
|
||||
@@ -241,7 +247,8 @@ class _SettingsStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Setting
|
||||
if (enableAnimations != null) #enableAnimations: enableAnimations,
|
||||
if (deviceType != $none) #deviceType: deviceType,
|
||||
if (deviceModel != $none) #deviceModel: deviceModel,
|
||||
if (shareViaLinkAutoAccept != null) #shareViaLinkAutoAccept: shareViaLinkAutoAccept
|
||||
if (shareViaLinkAutoAccept != null) #shareViaLinkAutoAccept: shareViaLinkAutoAccept,
|
||||
if (discoveryTimeout != null) #discoveryTimeout: discoveryTimeout
|
||||
}));
|
||||
@override
|
||||
SettingsState $make(CopyWithData data) => SettingsState(
|
||||
@@ -266,7 +273,8 @@ class _SettingsStateCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Setting
|
||||
enableAnimations: data.get(#enableAnimations, or: $value.enableAnimations),
|
||||
deviceType: data.get(#deviceType, or: $value.deviceType),
|
||||
deviceModel: data.get(#deviceModel, or: $value.deviceModel),
|
||||
shareViaLinkAutoAccept: data.get(#shareViaLinkAutoAccept, or: $value.shareViaLinkAutoAccept));
|
||||
shareViaLinkAutoAccept: data.get(#shareViaLinkAutoAccept, or: $value.shareViaLinkAutoAccept),
|
||||
discoveryTimeout: data.get(#discoveryTimeout, or: $value.discoveryTimeout));
|
||||
|
||||
@override
|
||||
SettingsStateCopyWith<$R2, SettingsState, $Out2> $chain<$R2, $Out2>(Then<$Out2, $R2> t) => _SettingsStateCopyWithImpl($value, $cast, t);
|
||||
|
||||
@@ -353,6 +353,20 @@ class SettingsTab extends StatelessWidget {
|
||||
},
|
||||
),
|
||||
),
|
||||
if (vm.advanced)
|
||||
_SettingsEntry(
|
||||
label: t.settingsTab.network.discoveryTimeout,
|
||||
child: TextFieldTv(
|
||||
name: t.settingsTab.network.discoveryTimeout,
|
||||
controller: vm.timeoutController,
|
||||
onChanged: (s) async {
|
||||
final timeout = int.tryParse(s);
|
||||
if (timeout != null) {
|
||||
await ref.notifier(settingsProvider).setDiscoveryTimeout(timeout);
|
||||
}
|
||||
},
|
||||
),
|
||||
),
|
||||
if (vm.advanced)
|
||||
_BooleanEntry(
|
||||
label: t.settingsTab.network.encryption,
|
||||
|
||||
@@ -50,6 +50,7 @@ class SettingsTabController extends ReduxNotifier<SettingsTabVm> {
|
||||
aliasController: TextEditingController(text: _settingsService.state.alias),
|
||||
deviceModelController: TextEditingController(text: _initialDeviceInfo.deviceModel),
|
||||
portController: TextEditingController(text: _settingsService.state.port.toString()),
|
||||
timeoutController: TextEditingController(text: _settingsService.state.discoveryTimeout.toString()),
|
||||
multicastController: TextEditingController(text: _settingsService.state.multicastGroup),
|
||||
settings: _settingsService.state,
|
||||
serverState: _serverService.state,
|
||||
@@ -113,6 +114,7 @@ class SettingsTabController extends ReduxNotifier<SettingsTabVm> {
|
||||
state.aliasController.dispose();
|
||||
state.deviceModelController.dispose();
|
||||
state.portController.dispose();
|
||||
state.timeoutController.dispose();
|
||||
state.multicastController.dispose();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ class SettingsTabVm with SettingsTabVmMappable {
|
||||
final TextEditingController aliasController;
|
||||
final TextEditingController deviceModelController;
|
||||
final TextEditingController portController;
|
||||
final TextEditingController timeoutController;
|
||||
final TextEditingController multicastController;
|
||||
|
||||
final SettingsState settings;
|
||||
@@ -33,6 +34,7 @@ class SettingsTabVm with SettingsTabVmMappable {
|
||||
required this.aliasController,
|
||||
required this.deviceModelController,
|
||||
required this.portController,
|
||||
required this.timeoutController,
|
||||
required this.multicastController,
|
||||
required this.settings,
|
||||
required this.serverState,
|
||||
|
||||
@@ -30,6 +30,8 @@ class SettingsTabVmMapper extends ClassMapperBase<SettingsTabVm> {
|
||||
static const Field<SettingsTabVm, TextEditingController> _f$deviceModelController = Field('deviceModelController', _$deviceModelController);
|
||||
static TextEditingController _$portController(SettingsTabVm v) => v.portController;
|
||||
static const Field<SettingsTabVm, TextEditingController> _f$portController = Field('portController', _$portController);
|
||||
static TextEditingController _$timeoutController(SettingsTabVm v) => v.timeoutController;
|
||||
static const Field<SettingsTabVm, TextEditingController> _f$timeoutController = Field('timeoutController', _$timeoutController);
|
||||
static TextEditingController _$multicastController(SettingsTabVm v) => v.multicastController;
|
||||
static const Field<SettingsTabVm, TextEditingController> _f$multicastController = Field('multicastController', _$multicastController);
|
||||
static SettingsState _$settings(SettingsTabVm v) => v.settings;
|
||||
@@ -63,6 +65,7 @@ class SettingsTabVmMapper extends ClassMapperBase<SettingsTabVm> {
|
||||
#aliasController: _f$aliasController,
|
||||
#deviceModelController: _f$deviceModelController,
|
||||
#portController: _f$portController,
|
||||
#timeoutController: _f$timeoutController,
|
||||
#multicastController: _f$multicastController,
|
||||
#settings: _f$settings,
|
||||
#serverState: _f$serverState,
|
||||
@@ -84,6 +87,7 @@ class SettingsTabVmMapper extends ClassMapperBase<SettingsTabVm> {
|
||||
aliasController: data.dec(_f$aliasController),
|
||||
deviceModelController: data.dec(_f$deviceModelController),
|
||||
portController: data.dec(_f$portController),
|
||||
timeoutController: data.dec(_f$timeoutController),
|
||||
multicastController: data.dec(_f$multicastController),
|
||||
settings: data.dec(_f$settings),
|
||||
serverState: data.dec(_f$serverState),
|
||||
@@ -151,6 +155,7 @@ abstract class SettingsTabVmCopyWith<$R, $In extends SettingsTabVm, $Out> implem
|
||||
TextEditingController? aliasController,
|
||||
TextEditingController? deviceModelController,
|
||||
TextEditingController? portController,
|
||||
TextEditingController? timeoutController,
|
||||
TextEditingController? multicastController,
|
||||
SettingsState? settings,
|
||||
ServerState? serverState,
|
||||
@@ -185,6 +190,7 @@ class _SettingsTabVmCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Setting
|
||||
TextEditingController? aliasController,
|
||||
TextEditingController? deviceModelController,
|
||||
TextEditingController? portController,
|
||||
TextEditingController? timeoutController,
|
||||
TextEditingController? multicastController,
|
||||
SettingsState? settings,
|
||||
Object? serverState = $none,
|
||||
@@ -202,6 +208,7 @@ class _SettingsTabVmCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Setting
|
||||
if (aliasController != null) #aliasController: aliasController,
|
||||
if (deviceModelController != null) #deviceModelController: deviceModelController,
|
||||
if (portController != null) #portController: portController,
|
||||
if (timeoutController != null) #timeoutController: timeoutController,
|
||||
if (multicastController != null) #multicastController: multicastController,
|
||||
if (settings != null) #settings: settings,
|
||||
if (serverState != $none) #serverState: serverState,
|
||||
@@ -221,6 +228,7 @@ class _SettingsTabVmCopyWithImpl<$R, $Out> extends ClassCopyWithBase<$R, Setting
|
||||
aliasController: data.get(#aliasController, or: $value.aliasController),
|
||||
deviceModelController: data.get(#deviceModelController, or: $value.deviceModelController),
|
||||
portController: data.get(#portController, or: $value.portController),
|
||||
timeoutController: data.get(#timeoutController, or: $value.timeoutController),
|
||||
multicastController: data.get(#multicastController, or: $value.multicastController),
|
||||
settings: data.get(#settings, or: $value.settings),
|
||||
serverState: data.get(#serverState, or: $value.serverState),
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:dio/dio.dart';
|
||||
import 'package:dio/io.dart';
|
||||
import 'package:localsend_app/provider/logging/http_logs_provider.dart';
|
||||
import 'package:localsend_app/provider/security_provider.dart';
|
||||
import 'package:localsend_app/provider/settings_provider.dart';
|
||||
import 'package:refena_flutter/refena_flutter.dart';
|
||||
|
||||
class DioCollection {
|
||||
@@ -22,8 +23,9 @@ class DioCollection {
|
||||
/// Provides a dio having a specific timeout.
|
||||
final dioProvider = ViewProvider((ref) {
|
||||
final securityContext = ref.watch(securityProvider);
|
||||
final discoveryTimeout = ref.read(settingsProvider).discoveryTimeout;
|
||||
return DioCollection(
|
||||
startupCheckAnotherInstance: createDio(const Duration(milliseconds: 100), securityContext, null),
|
||||
startupCheckAnotherInstance: createDio(Duration(milliseconds: discoveryTimeout), securityContext, null),
|
||||
discovery: createDio(const Duration(seconds: 2), securityContext, null),
|
||||
longLiving: createDio(const Duration(days: 30), securityContext, ref),
|
||||
);
|
||||
|
||||
@@ -51,6 +51,7 @@ const _themeKey = 'ls_theme'; // now called brightness
|
||||
const _colorKey = 'ls_color';
|
||||
const _localeKey = 'ls_locale';
|
||||
const _portKey = 'ls_port';
|
||||
const _timeoutKey = 'ls_timeout';
|
||||
const _multicastGroupKey = 'ls_multicast_group';
|
||||
const _destinationKey = 'ls_destination';
|
||||
const _saveToGallery = 'ls_save_to_gallery';
|
||||
@@ -232,6 +233,14 @@ class PersistenceService {
|
||||
await _prefs.setInt(_portKey, port);
|
||||
}
|
||||
|
||||
int getDiscoveryTimeout() {
|
||||
return _prefs.getInt(_timeoutKey) ?? defaultDiscoveryTimeout;
|
||||
}
|
||||
|
||||
Future<void> setDiscoveryTimeout(int timeout) async {
|
||||
await _prefs.setInt(_timeoutKey, timeout);
|
||||
}
|
||||
|
||||
bool getShareViaLinkAutoAccept() {
|
||||
return _prefs.getBool(_shareViaLinkAutoAccept) ?? false;
|
||||
}
|
||||
|
||||
@@ -40,6 +40,7 @@ class SettingsService extends PureNotifier<SettingsState> {
|
||||
deviceType: _persistence.getDeviceType(),
|
||||
deviceModel: _persistence.getDeviceModel(),
|
||||
shareViaLinkAutoAccept: _persistence.getShareViaLinkAutoAccept(),
|
||||
discoveryTimeout: _persistence.getDiscoveryTimeout(),
|
||||
);
|
||||
|
||||
Future<void> setAlias(String alias) async {
|
||||
@@ -77,6 +78,13 @@ class SettingsService extends PureNotifier<SettingsState> {
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> setDiscoveryTimeout(int timeout) async {
|
||||
await _persistence.setDiscoveryTimeout(timeout);
|
||||
state = state.copyWith(
|
||||
discoveryTimeout: timeout,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> setMulticastGroup(String group) async {
|
||||
await _persistence.setMulticastGroup(group);
|
||||
state = state.copyWith(
|
||||
|
||||
@@ -19,6 +19,11 @@ const fallbackProtocolVersion = '1.0';
|
||||
/// and multicast port.
|
||||
const defaultPort = 53317;
|
||||
|
||||
/// The default discovery timeout in milliseconds.
|
||||
/// This is the time the discovery server waits for responses.
|
||||
/// If no response is received within this time, the target server is unavailable.
|
||||
const defaultDiscoveryTimeout = 100;
|
||||
|
||||
/// The default multicast group should be 224.0.0.0/24
|
||||
/// because on some Android devices this is the only IP range
|
||||
/// that can receive UDP multicast messages.
|
||||
|
||||
Reference in New Issue
Block a user