Skip to content

Commit b2ddfdd

Browse files
committed
Add discover page and button
1 parent ff86e39 commit b2ddfdd

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed

lib/pages/discover_page.dart

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import 'dart:async';
2+
3+
import 'package:bonsoir/bonsoir.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:rutorrentflutter/api/api_conf.dart';
6+
7+
class DiscoverPage extends StatefulWidget {
8+
@override
9+
_DiscoverPageState createState() => _DiscoverPageState();
10+
}
11+
12+
class _DiscoverPageState extends State<DiscoverPage> {
13+
final BonsoirDiscovery zeroconfService =
14+
BonsoirDiscovery(type: "_rutorrent_mobile._tcp");
15+
final List<ResolvedBonsoirService> urls = [];
16+
StreamSubscription zeroconfSub;
17+
18+
@override
19+
void dispose() {
20+
zeroconfSub?.cancel();
21+
if (zeroconfService.isReady && !zeroconfService.isStopped) {
22+
zeroconfService.stop();
23+
}
24+
super.dispose();
25+
}
26+
27+
static buildURL(ResolvedBonsoirService resolved) {
28+
// TODO: Enable password authentication
29+
var protocol = resolved.attributes["protocol"];
30+
var port = resolved.port;
31+
if (port == 80) {
32+
return "http://${resolved.ip}/";
33+
} else if (port == 443) {
34+
return "https://${resolved.ip}/";
35+
} else {
36+
if (protocol != null) {
37+
return "$protocol://${resolved.ip}:${resolved.port}/";
38+
} else {
39+
return "http://${resolved.ip}:${resolved.port}";
40+
}
41+
}
42+
}
43+
44+
void setupListener() {
45+
zeroconfSub = zeroconfService.eventStream.listen((event) {
46+
if (event.isServiceResolved &&
47+
event.type == BonsoirDiscoveryEventType.DISCOVERY_SERVICE_RESOLVED) {
48+
var resolved = event.service as ResolvedBonsoirService;
49+
setState(() {
50+
urls.add(resolved);
51+
});
52+
}
53+
});
54+
zeroconfService.start();
55+
}
56+
57+
@override
58+
void initState() {
59+
zeroconfService.ready.then((_) => setupListener());
60+
super.initState();
61+
}
62+
63+
@override
64+
Widget build(BuildContext context) {
65+
return Dialog(
66+
child: Container(
67+
child: ListView.builder(
68+
itemBuilder: (context, index) => ListTile(
69+
title: Text(urls[index].name),
70+
subtitle: Text("IP address: ${urls[index].ip}"),
71+
onTap: () {
72+
var api = Api();
73+
api.setUrl(buildURL(urls[index]));
74+
api.setUsername("");
75+
api.setPassword("");
76+
Navigator.of(context).pop(api);
77+
},
78+
),
79+
itemCount: urls.length,
80+
)),
81+
);
82+
}
83+
}

lib/screens/configurations_screen.dart

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:provider/provider.dart';
77
import 'package:rutorrentflutter/components/data_input.dart';
88
import 'package:rutorrentflutter/components/password_input.dart';
99
import 'package:rutorrentflutter/models/mode.dart';
10+
import 'package:rutorrentflutter/pages/discover_page.dart';
1011
import 'package:rutorrentflutter/screens/main_screen.dart';
1112
import 'package:modal_progress_hud/modal_progress_hud.dart';
1213
import 'package:rutorrentflutter/utilities/preferences.dart';
@@ -215,6 +216,47 @@ class _ConfigurationsScreenState extends State<ConfigurationsScreen> {
215216
passwordFocus: passwordFocus,
216217
),
217218
),
219+
Padding(
220+
padding:
221+
const EdgeInsets.symmetric(vertical: 16, horizontal: 32),
222+
child: Container(
223+
width: double.infinity,
224+
child: ElevatedButton(
225+
style: ElevatedButton.styleFrom(
226+
shape: RoundedRectangleBorder(
227+
borderRadius: BorderRadius.circular(5.0),
228+
side:
229+
BorderSide(color: Theme.of(context).primaryColor),
230+
),
231+
primary: Provider.of<Mode>(context).isLightMode
232+
? Colors.white
233+
: Colors.black,
234+
),
235+
child: Padding(
236+
padding: const EdgeInsets.symmetric(
237+
horizontal: 28, vertical: 16),
238+
child: Text(
239+
'Discover ruTorrent servers in LAN',
240+
style: TextStyle(
241+
color: Theme.of(context).primaryColor,
242+
fontSize: 18),
243+
),
244+
),
245+
onPressed: () async {
246+
var received = await showDialog<Api>(
247+
context: context, builder: (ctx) => DiscoverPage());
248+
if (received != null) {
249+
Api api = Provider.of<Api>(context,
250+
listen: false); // One call to provider
251+
api.setUrl(api.url);
252+
api.setUsername(api.username);
253+
api.setPassword(api.password);
254+
_validateConfigurationDetails(api);
255+
}
256+
},
257+
),
258+
),
259+
),
218260
Padding(
219261
padding:
220262
const EdgeInsets.symmetric(vertical: 16, horizontal: 32),

0 commit comments

Comments
 (0)