add discovery timeout setting (#1304)

This commit is contained in:
o2e
2024-05-02 23:24:46 +08:00
committed by GitHub
parent 60cd399fa6
commit a0a376adf7
13 changed files with 69 additions and 6 deletions

View File

@@ -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",

View File

@@ -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';

View File

@@ -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 => '多播';

View File

@@ -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,
});
}

View File

@@ -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);

View File

@@ -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,

View File

@@ -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();
}

View File

@@ -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,

View File

@@ -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),

View File

@@ -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),
);

View File

@@ -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;
}

View File

@@ -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(

View File

@@ -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.