1
+ import 'package:desktop_adb_file_browser/riverpod/file_queue.dart' ;
1
2
import 'package:desktop_adb_file_browser/riverpod/package_list.dart' ;
2
3
import 'package:desktop_adb_file_browser/riverpod/selected_device.dart' ;
3
4
import 'package:desktop_adb_file_browser/utils/adb.dart' ;
4
5
import 'package:desktop_adb_file_browser/widgets/adb_queue_indicator.dart' ;
6
+ import 'package:file_selector/file_selector.dart' ;
7
+ import 'package:fluentui_system_icons/fluentui_system_icons.dart' ;
5
8
import 'package:flutter/material.dart' ;
6
9
import 'package:flutter/services.dart' ;
7
10
import 'package:flutter_riverpod/flutter_riverpod.dart' ;
11
+ import 'package:uuid/uuid.dart' ;
8
12
9
13
class PackageList extends ConsumerStatefulWidget {
10
14
const PackageList ({super .key, required this .serial});
@@ -24,6 +28,16 @@ class _PackageListState extends ConsumerState<PackageList> {
24
28
appBar: AppBar (
25
29
title: const Text ("Packages" ),
26
30
automaticallyImplyLeading: true ,
31
+ actions: [
32
+ IconButton (
33
+ onPressed: () async {
34
+ final path = await openFile ();
35
+ if (path == null ) return ;
36
+
37
+ await uploadAndInstallAPK (path.path);
38
+ },
39
+ icon: const Icon (FluentIcons .arrow_upload_32_regular))
40
+ ],
27
41
),
28
42
body: ADBQueueIndicator (
29
43
child: packageListFuture.when (
@@ -100,4 +114,24 @@ class _PackageListState extends ConsumerState<PackageList> {
100
114
),
101
115
);
102
116
}
117
+
118
+ Future <void > uploadAndInstallAPK (String apkPath) async {
119
+ var notifier = ref.read (uploadQueueProvider.notifier);
120
+ var device = ref.read (selectedDeviceProvider);
121
+
122
+ var uuid = const Uuid ();
123
+ var randomPath = "/tmp/${uuid .v8 ()}.apk" ;
124
+
125
+ await notifier.doUpload (device? .serialName, apkPath, randomPath);
126
+ await Adb .installPackage (device? .serialName, randomPath);
127
+
128
+ if (! context.mounted) return ;
129
+ final snackBar = SnackBar (
130
+ content:
131
+ Text ('Installed package ${Adb .adbPathContext .basename (apkPath )}' ),
132
+ );
133
+ ScaffoldMessenger .of (context).showSnackBar (snackBar);
134
+
135
+ await Adb .removeFile (device? .serialName, randomPath);
136
+ }
103
137
}
0 commit comments