diff options
Diffstat (limited to 'lib/widgets/scan_page.dart')
-rw-r--r-- | lib/widgets/scan_page.dart | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/lib/widgets/scan_page.dart b/lib/widgets/scan_page.dart new file mode 100644 index 0000000..c557657 --- /dev/null +++ b/lib/widgets/scan_page.dart @@ -0,0 +1,142 @@ +// Copyright (C) 2025, uvok cheetah +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. + +import 'package:uvok_epaper_badge/control/scanner_controller.dart'; +import 'package:uvok_epaper_badge/widgets/device_details.dart'; +import 'package:uvok_epaper_badge/widgets/device_scan_select.dart'; +import 'package:uvok_epaper_badge/model/device.dart'; +import 'package:flutter/material.dart'; +import 'package:logger/logger.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:uvok_epaper_badge/model/device_connection.dart'; +import 'package:uvok_epaper_badge/model/device_connection_factory.dart'; + +var logger = Logger(); + +class ScanPage extends StatefulWidget { + const ScanPage({super.key, required this.title, required this.deviceScanner}); + + // Original doc: Fields in a Widget subclass are always marked "final". + + final String title; + final ScannerController deviceScanner; + + @override + State<ScanPage> createState() => _ScanPageState(); +} + +class _ScanPageState extends State<ScanPage> { + Device? selectedDevice; + + void _doConnect() async { + final Device? dev = selectedDevice; + if (dev == null) return; + + final DeviceConnection connection = + DeviceConnectionFactory.createConnection(dev); + //??? + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + DeviceDetailsScreen(device: dev, deviceConnection: connection), + ), + ); + } + + void _doScan() async { + setState(() { + selectedDevice = null; + }); + + // ... + await widget.deviceScanner.startScan(); + } + + Future getPermissions() async { + try { + await Permission.bluetooth.request(); + } catch (e) { + logger.e(e.toString()); + } + } + + @override + void initState() { + super.initState(); + getPermissions(); + } + + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: widget.deviceScanner.statusStream, + initialData: ScanStatus.idle, + builder: (context, asyncSnapshot) { + bool isScanning = asyncSnapshot.data == ScanStatus.scanning; + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + title: Text(widget.title), + ), + body: Center( + child: Column( + // TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint" + // action in the IDE, or press "p" in the console), to see the + // wireframe for each widget. + mainAxisAlignment: MainAxisAlignment.center, + spacing: 24, + children: <Widget>[ + SizedBox(height: 15), + Row( + mainAxisAlignment: MainAxisAlignment.center, + spacing: 15.0, + children: [ + ElevatedButton( + onPressed: isScanning ? null : _doScan, + child: isScanning + ? Text("Scanning...") + : Text("Start scan"), + ), + ElevatedButton( + onPressed: (selectedDevice == null || isScanning) + ? null + : _doConnect, + child: Text("Connect"), + ), + ], + ), + Expanded( + child: StreamBuilder( + stream: widget.deviceScanner.scanResultsStream, + initialData: <Device>[], + builder: (context, asyncSnapshot) { + return DeviceScanSelection( + items: asyncSnapshot.data ?? [], + onItemSelected: (item) { + setState(() => selectedDevice = item); + }, + ); + }, + ), + ), + ], + ), + ), + ); + }, + ); + } +} |