Skip to content

Commit 49564c2

Browse files
committed
Add APK downloading and cleanup
1 parent 8c515f6 commit 49564c2

File tree

3 files changed

+69
-23
lines changed

3 files changed

+69
-23
lines changed

lib/pages/main/package_list.dart

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -101,29 +101,17 @@ class _PackageListState extends ConsumerState<PackageList> {
101101
onTap: () {},
102102
trailing: Wrap(
103103
children: [
104-
IconButton(onPressed: () {}, icon: const Icon(Icons.download)),
105104
IconButton(
106-
onPressed: () async {
107-
await Adb.uninstallPackage(
108-
selectedDevice!.serialName, packageId);
109-
if (!context.mounted) return;
110-
const snackBar = SnackBar(
111-
content: Text('Uninstalled package'),
112-
);
113-
ScaffoldMessenger.of(context).showSnackBar(snackBar);
114-
},
115-
icon: const Icon(Icons.delete)),
105+
onPressed: () =>
106+
_downloadPackage(selectedDevice!.serialName, packageId),
107+
icon: const Icon(Icons.download)),
116108
IconButton(
117-
onPressed: () async {
118-
await Clipboard.setData(
119-
ClipboardData(text: packageMetadata.packageId));
120-
121-
if (!context.mounted) return;
122-
const snackBar = SnackBar(
123-
content: Text('Copied package id to clipboard'),
124-
);
125-
ScaffoldMessenger.of(context).showSnackBar(snackBar);
126-
},
109+
onPressed: () =>
110+
_deletePackage(selectedDevice!.serialName, packageId),
111+
icon: const Icon(Icons.delete),
112+
),
113+
IconButton(
114+
onPressed: () => _copyPath(packageMetadata),
127115
icon: const Icon(Icons.copy))
128116
],
129117
),
@@ -156,6 +144,45 @@ class _PackageListState extends ConsumerState<PackageList> {
156144
);
157145
ScaffoldMessenger.of(context).showSnackBar(snackBar);
158146

147+
// cleanup
159148
await Adb.removeFile(device?.serialName, randomPath);
160149
}
150+
151+
void _deletePackage(String serialName, String packageId) async {
152+
await Adb.uninstallPackage(serialName, packageId);
153+
if (!context.mounted) return;
154+
const snackBar = SnackBar(
155+
content: Text('Uninstalled package'),
156+
showCloseIcon: true,
157+
);
158+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
159+
}
160+
161+
void _downloadPackage(String serialName, String packageId) async {
162+
var destPath = await getSaveLocation(suggestedName: "$packageId.apk");
163+
if (destPath == null) return;
164+
165+
var apkPath = await Adb.getPackagePath(serialName, packageId);
166+
var notifier = ref.read(downloadQueueProvider.notifier);
167+
168+
await notifier.doDownload(serialName, apkPath, destPath.path);
169+
170+
if (!context.mounted) return;
171+
final snackBar = SnackBar(
172+
content: Text('Downloaded apk to ${destPath.path}'),
173+
showCloseIcon: true,
174+
);
175+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
176+
}
177+
178+
void _copyPath(PackageMetadata packageMetadata) async {
179+
await Clipboard.setData(ClipboardData(text: packageMetadata.packageId));
180+
181+
if (!context.mounted) return;
182+
const snackBar = SnackBar(
183+
content: Text('Copied package id to clipboard'),
184+
showCloseIcon: true,
185+
);
186+
ScaffoldMessenger.of(context).showSnackBar(snackBar);
187+
}
161188
}

lib/riverpod/package_list.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ class PackageList extends _$PackageList {
2525
Future<List<String>> build() async {
2626
final serial = ref.watch(selectedDeviceProvider);
2727

28-
return Adb.getPackageList(serial?.serialName);
28+
var list = await Adb.getPackageList(serial?.serialName);
29+
30+
list.sort();
31+
32+
return list;
2933
}
3034

3135
void installToDevice(String path) {}

lib/utils/adb.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,19 @@ drwxrwx--x 2 u0_a140 sdcard_rw 3488 2023-11-01 10:45 mods_old
299299
return listed;
300300
}
301301

302+
static Future<String> getPackagePath(
303+
String? serialName, String packageId) async {
304+
var result =
305+
await runAdbCommand(serialName, ["shell", "pm path $packageId"]);
306+
307+
String stdout = result.stdout;
308+
if (stdout.isEmpty) throw "Failed to get path for $packageId";
309+
310+
var path = stdout.substring("package:".length).trim();
311+
312+
return path;
313+
}
314+
302315
static Future<PackageMetadata> getPackageInfo(
303316
String? serialName, String packageId) async {
304317
var result = await runAdbCommand(
@@ -320,7 +333,9 @@ drwxrwx--x 2 u0_a140 sdcard_rw 3488 2023-11-01 10:45 mods_old
320333
static Future<void> installPackage(String? serialName, String path) async {
321334
await runAdbCommand(serialName, ["install", path]);
322335
}
323-
static Future<void> uninstallPackage(String? serialName, String packageId) async {
336+
337+
static Future<void> uninstallPackage(
338+
String? serialName, String packageId) async {
324339
await runAdbCommand(serialName, ["uninstall", packageId]);
325340
}
326341

0 commit comments

Comments
 (0)