Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions lib/constants/github_id.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,4 @@ typedef GhId = String;

extension GhIdX on GhId {
String get url => 'https://github.com/$this';

String get markdownLink => '[$this]($url)';
}
2 changes: 0 additions & 2 deletions lib/kit/core/ext/datetime.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,4 @@ extension DateTimeX on DateTime {
String get hourMinute {
return '${hour.toString().padLeft(2, '0')}:${minute.toString().padLeft(2, '0')}';
}

static int get timestamp => DateTime.now().millisecondsSinceEpoch;
}
12 changes: 0 additions & 12 deletions lib/kit/core/platform.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,6 @@ enum Pfs {
_ => unknown,
};
}();

static final String separator = isWindows ? '\\' : '/';

static final String? homeDir = () {
final envVars = Platform.environment;
if (isMacOS || isLinux) {
return envVars['HOME'];
} else if (isWindows) {
return envVars['UserProfile'];
}
return null;
}();
}

final isLinux = Pfs.type == Pfs.linux;
Expand Down
185 changes: 0 additions & 185 deletions lib/models/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -578,203 +578,18 @@ class Settings extends ChangeNotifier with Loggable {
}

// Built-in Aria2 instance setters
// Connection settings
Future<void> setRpcListenPort(int port) async {
_rpcListenPort = port;
notifyListeners();
await _saveAllSettings();
}

Future<void> setRpcSecret(String secret) async {
_rpcSecret = secret;
notifyListeners();
await _saveAllSettings();
}

// Transfer settings
Future<void> setMaxConcurrentDownloads(int value) async {
_maxConcurrentDownloads = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setMaxConnectionPerServer(int value) async {
_maxConnectionPerServer = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setSplit(int value) async {
_split = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setContinueDownloads(bool value) async {
_continueDownloads = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setDownloadDir(String value) async {
_downloadDir = value;
notifyListeners();
await _saveAllSettings();
}

// Speed settings
Future<void> setMaxOverallDownloadLimit(int limit) async {
_maxOverallDownloadLimit = limit;
notifyListeners();
await _saveAllSettings();
}

Future<void> setMaxOverallUploadLimit(int limit) async {
_maxOverallUploadLimit = limit;
notifyListeners();
await _saveAllSettings();
}

// BT settings
Future<void> setBtSaveMetadata(bool value) async {
_btSaveMetadata = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setBtForceEncryption(bool value) async {
_btForceEncryption = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setBtLoadSavedMetadata(bool value) async {
_btLoadSavedMetadata = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setKeepSeeding(bool value) async {
_keepSeeding = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setSeedRatio(double ratio) async {
_seedRatio = ratio;
notifyListeners();
await _saveAllSettings();
}

Future<void> setSeedTime(int minutes) async {
_seedTime = minutes;
notifyListeners();
await _saveAllSettings();
}

Future<void> setBtListenPort(String port) async {
_btListenPort = port;
notifyListeners();
await _saveAllSettings();
}

Future<void> setBtTracker(String trackers) async {
_btTracker = _normalizeBtTracker(trackers);
notifyListeners();
await _saveAllSettings();
}

Future<void> setBtExcludeTracker(String trackers) async {
_btExcludeTracker = trackers;
notifyListeners();
await _saveAllSettings();
}

// Advanced settings
Future<void> setProxyEnabled(bool value) async {
_proxyEnabled = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setAllProxy(String proxy) async {
_allProxy = proxy;
notifyListeners();
await _saveAllSettings();
}

Future<void> setNoProxy(String noProxy) async {
_noProxy = noProxy;
notifyListeners();
await _saveAllSettings();
}

Future<void> setDhtListenPort(int port) async {
_dhtListenPort = port;
notifyListeners();
await _saveAllSettings();
}

Future<void> setEnableDht6(bool value) async {
_enableDht6 = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setEnableUpnp(bool value) async {
_enableUpnp = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setSessionPath(String path) async {
_sessionPath = path;
notifyListeners();
await _saveAllSettings();
}

Future<void> setLogPath(String path) async {
_logPath = path;
notifyListeners();
await _saveAllSettings();
}

Future<void> setAutoSyncTracker(bool value) async {
_autoSyncTracker = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setLastSyncTrackerTime(int value) async {
_lastSyncTrackerTime = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setTrackerSource(String value) async {
_trackerSource = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setAutoFileRenaming(bool value) async {
_autoFileRenaming = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setAllowOverwrite(bool value) async {
_allowOverwrite = value;
notifyListeners();
await _saveAllSettings();
}

Future<void> setUserAgent(String userAgent) async {
_userAgent = userAgent;
notifyListeners();
await _saveAllSettings();
}

Future<void> updateBuiltinInstanceSettings({
required int rpcListenPort,
required String rpcSecret,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ import '../../../utils/format_utils.dart';
import '../models/download_task.dart';

class TaskDetailsBtHelpers {
static final _azureusPattern = RegExp(r'^-([A-Za-z~]{2})(.{4})-');
static final _digitPattern = RegExp(r'[0-9]');
static final _letterPattern = RegExp(r'[A-Za-z]');
static Widget buildBitfieldVisualization(
BuildContext context,
DownloadTask task,
Expand Down Expand Up @@ -327,7 +330,7 @@ class TaskDetailsBtHelpers {
return 'unknown';
}

final azureusMatch = RegExp(r'^-([A-Za-z~]{2})(.{4})-').firstMatch(decoded);
final azureusMatch = _azureusPattern.firstMatch(decoded);
if (azureusMatch != null) {
final clientCode = azureusMatch.group(1)!;
final versionRaw = azureusMatch.group(2)!;
Expand Down Expand Up @@ -370,9 +373,9 @@ class TaskDetailsBtHelpers {
static String _formatPeerVersion(String rawVersion) {
final segments = <String>[];
for (final char in rawVersion.split('')) {
if (RegExp(r'[0-9]').hasMatch(char)) {
if (_digitPattern.hasMatch(char)) {
segments.add(char);
} else if (RegExp(r'[A-Za-z]').hasMatch(char)) {
} else if (_letterPattern.hasMatch(char)) {
segments.add(char.toLowerCase());
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,6 @@ class TaskDetailsDialog {
),
},
);
client.close();

onTaskUpdated?.call();

Expand Down
7 changes: 5 additions & 2 deletions lib/pages/download_page/download_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -377,9 +377,12 @@ class DownloadPageState extends State<DownloadPage>

if (_searchQuery.isNotEmpty) {
final query = _searchQuery.toLowerCase();
final lowerInstanceNames = <String, String>{
for (final entry in _instanceNames.entries)
entry.key: entry.value.toLowerCase(),
};
tasks = tasks.where((task) {
final instanceName = (_instanceNames[task.instanceId] ?? '')
.toLowerCase();
final instanceName = lowerInstanceNames[task.instanceId] ?? '';
final taskDir = (task.dir ?? '').toLowerCase();
final taskName = task.name.toLowerCase();
return taskName.contains(query) ||
Expand Down
26 changes: 16 additions & 10 deletions lib/services/download_data_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class DownloadDataService extends ChangeNotifier with Loggable {
Timer? _refreshTimer;

List<DownloadTask> _tasks = [];
List<DownloadTask> _tasksView = const [];
bool _isRefreshing = false;
String? _lastError;
final List<DownloadTaskNotification> _pendingNotifications = [];
Expand All @@ -44,7 +45,7 @@ class DownloadDataService extends ChangeNotifier with Loggable {
final Map<String, Aria2RpcClient> _clientCache = {};
List<Aria2Instance> Function()? _connectedInstancesProvider;

List<DownloadTask> get tasks => UnmodifiableListView(_tasks);
List<DownloadTask> get tasks => _tasksView;
int get tasksVersion => _tasksVersion;
bool get isRefreshing => _isRefreshing;
String? get lastError => _lastError;
Expand Down Expand Up @@ -86,6 +87,7 @@ class DownloadDataService extends ChangeNotifier with Loggable {
final hadTasks = _tasks.isNotEmpty;
final hadError = _lastError != null;
_tasks = [];
_tasksView = UnmodifiableListView(_tasks);
_tasksVersion++;
_lastError = null;
if (hadTasks || hadError) {
Expand All @@ -102,14 +104,18 @@ class DownloadDataService extends ChangeNotifier with Loggable {
final taskGroups = await Future.wait(
connectedInstances.map(_fetchTasksForInstance),
);
final newTasks = taskGroups.expand((tasks) => tasks).toList()
..sort(_compareTasks);
final newTasks = taskGroups.expand((tasks) => tasks).toList();
final lowerCaseNames = <String, String>{
for (final t in newTasks) t.name: t.name.toLowerCase(),
};
newTasks.sort((a, b) => _compareTasks(a, b, lowerCaseNames));

final terminalTransitionInstanceIds = _collectTaskNotifications(
previousTasks,
newTasks,
);
_tasks = newTasks;
_tasksView = UnmodifiableListView(_tasks);
_tasksVersion++;
_saveSessionsForTerminalTransitions(
connectedInstances,
Expand Down Expand Up @@ -217,7 +223,11 @@ class DownloadDataService extends ChangeNotifier with Loggable {
DownloadStatus.stopped: 2,
};

int _compareTasks(DownloadTask left, DownloadTask right) {
int _compareTasks(
DownloadTask left,
DownloadTask right,
Map<String, String> lowerCaseNames,
) {
final leftOrder = _statusOrder[left.status] ?? 99;
final rightOrder = _statusOrder[right.status] ?? 99;
if (leftOrder != rightOrder) {
Expand All @@ -228,12 +238,8 @@ class DownloadDataService extends ChangeNotifier with Loggable {
return left.instanceId.compareTo(right.instanceId);
}

return _compareIgnoreCase(left.name, right.name);
}

static int _compareIgnoreCase(String a, String b) {
final aLower = a.toLowerCase();
final bLower = b.toLowerCase();
final aLower = lowerCaseNames[left.name] ?? left.name.toLowerCase();
final bLower = lowerCaseNames[right.name] ?? right.name.toLowerCase();
return aLower.compareTo(bLower);
}

Expand Down
Loading