Skip to content

Commit 4d61584

Browse files
committed
Add ADB concurrent process limit
1 parent f71950a commit 4d61584

File tree

5 files changed

+288
-3
lines changed

5 files changed

+288
-3
lines changed

lib/main.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:desktop_adb_file_browser/pages/main/browser.dart';
22
import 'package:desktop_adb_file_browser/pages/main/devices.dart';
33
import 'package:desktop_adb_file_browser/pages/main/logger.dart';
44
import 'package:desktop_adb_file_browser/pages/main_page.dart';
5+
import 'package:desktop_adb_file_browser/riverpod/settings.dart';
56
import 'package:desktop_adb_file_browser/src/pigeon_impl.dart';
67
import 'package:flex_color_scheme/flex_color_scheme.dart';
78
import 'package:flutter/foundation.dart';
@@ -10,6 +11,7 @@ import 'package:flutter/services.dart';
1011
import 'package:flutter_riverpod/flutter_riverpod.dart';
1112
import 'package:path_provider/path_provider.dart';
1213
import 'package:routemaster/routemaster.dart';
14+
import 'package:shared_preferences/shared_preferences.dart';
1315
import 'package:trace/trace.dart';
1416

1517
import 'package:path/path.dart' as path;
@@ -54,6 +56,8 @@ void main() async {
5456

5557
WidgetsFlutterBinding.ensureInitialized();
5658

59+
final prefs = SharedPreferences.getInstance();
60+
5761
final ConsoleLogger logger = ConsoleLogger(
5862
filter: DefaultLogFilter(
5963
LogLevel.verbose,
@@ -82,7 +86,10 @@ void main() async {
8286

8387
Trace.verbose("Pigeon");
8488
native2flutter = Native2FlutterImpl();
85-
runApp(const ProviderScope(child: MyApp()));
89+
runApp(ProviderScope(
90+
overrides: [preferencesProvider.overrideWithValue(await prefs)],
91+
child: const MyApp(),
92+
));
8693
}
8794

8895
class MyApp extends StatelessWidget {

lib/riverpod/settings.dart

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import 'dart:convert';
2+
3+
import 'package:desktop_adb_file_browser/utils/adb.dart';
4+
import 'package:freezed_annotation/freezed_annotation.dart';
5+
import 'package:riverpod_annotation/riverpod_annotation.dart';
6+
import 'package:shared_preferences/shared_preferences.dart';
7+
import 'package:trace/trace.dart';
8+
9+
part 'settings.g.dart';
10+
part 'settings.freezed.dart';
11+
12+
@freezed
13+
class SettingsData with _$SettingsData {
14+
const factory SettingsData({@Default(10) int multipleAdbInstances}) =
15+
_SettingsData;
16+
17+
factory SettingsData.fromJson(Map<String, Object?> json) =>
18+
_$SettingsDataFromJson(json);
19+
}
20+
21+
@Riverpod(keepAlive: true)
22+
SharedPreferences preferences(PreferencesRef ref) {
23+
throw UnimplementedError();
24+
}
25+
26+
@Riverpod(keepAlive: true)
27+
class Settings extends _$Settings {
28+
@override
29+
SettingsData build() {
30+
// hook into ADB
31+
ref.listenSelf((old, newV) {
32+
Trace.info("Listen self");
33+
34+
Adb.settings = newV;
35+
if (old != newV) {
36+
save();
37+
}
38+
});
39+
40+
final json = ref.watch(preferencesProvider).getString("settings");
41+
if (json == null) return const SettingsData();
42+
43+
return SettingsData.fromJson(jsonDecode(json));
44+
}
45+
46+
Future<void> save() async {
47+
var prefs = ref.read(preferencesProvider);
48+
49+
await prefs.setString("settings", jsonEncode(state.toJson()));
50+
51+
Trace.info("Saving prefs");
52+
}
53+
54+
void update(SettingsData settings) {
55+
state = settings;
56+
}
57+
}

lib/riverpod/settings.freezed.dart

Lines changed: 154 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/riverpod/settings.g.dart

Lines changed: 53 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/utils/adb.dart

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import 'dart:collection';
12
import 'dart:convert';
23
import 'dart:io';
34

45
import 'package:archive/archive_io.dart';
56
import 'package:async/async.dart';
67
import 'package:desktop_adb_file_browser/riverpod/package_list.dart';
8+
import 'package:desktop_adb_file_browser/riverpod/settings.dart';
79
import 'package:desktop_adb_file_browser/utils/platform.dart';
810
import 'package:dio/dio.dart';
911
import 'package:flutter/cupertino.dart';
@@ -32,6 +34,9 @@ abstract class Adb {
3234

3335
static Context get hostPath => host_path.context;
3436

37+
static SettingsData settings = const SettingsData();
38+
static final Set<Future<ProcessResult>> _runningProcesses = {};
39+
3540
static Future<void> downloadADB(
3641
DownloadProgressCallback c, CancelToken cancelToken) async {
3742
String adbFinalURL = adbDownloadURL;
@@ -117,16 +122,25 @@ abstract class Adb {
117122

118123
var adbPath = await _locateAdbPath();
119124

120-
// ignore: avoid_print
121125
Trace.info("Running adb command: \"$adbPath $newArgs\"");
122126

123-
var process = await Process.run(adbPath, newArgs, runInShell: true);
127+
while (_runningProcesses.length >= settings.multipleAdbInstances.abs()) {
128+
await Future.delayed(const Duration(milliseconds: 10));
129+
}
130+
131+
var processFuture = Process.run(adbPath, newArgs, runInShell: true);
132+
133+
// add to queue
134+
_runningProcesses.add(processFuture);
135+
136+
var process = await processFuture;
124137
if (process.stderr != null && process.stderr.toString().isNotEmpty) {
125138
final error = process.stderr;
126139
Trace.verbose("Error $error");
127140
debugPrintStack();
128141
throw error.toString();
129142
}
143+
_runningProcesses.remove(processFuture);
130144

131145
// if (process.exitCode != 0) throw "Process exit code was not 0!";
132146

0 commit comments

Comments
 (0)