// 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 . import 'package:badge/model/device.dart'; import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; var logger = Logger(); class DeviceDetailsScreen extends StatefulWidget { final Device device; const DeviceDetailsScreen({super.key, required this.device}); @override State createState() { return DeviceDetailsState(); } } class DeviceDetailsState extends State { String connectStatus = ""; // Just to have a resonable default subscription? // StreamSubscription subs = // Stream.empty().listen((e) => ()); /// Whether the back button should be active. bool backActive = false; // BluetoothCharacteristic? current; // BluetoothCharacteristic? available; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text("Device details"), ), body: Center( child: Column( spacing: 20, children: [ Text(connectStatus), ElevatedButton( onPressed: backActive ? backClick : null, child: Text("Back"), ), ], ), ), ); } @override void initState() { super.initState(); _doConnect(); } void backClick() { Navigator.pop(context); } void onConnStateChange(ConnectionStatus event) { setState(() { connectStatus = event.toString(); }); logger.i("New conn state: ${event.toString()}"); } @override void deactivate() { super.deactivate(); logger.i("Closing state"); // subs.cancel().ignore(); // widget.device.disconnect().ignore(); } void _doConnect() async { final dev = widget.device; // subs.cancel().ignore(); // subs = dev.connectionState.listen(onConnStateChange); try { logger.i("Try to connect..."); // connect timeout doesn't work under Linux // await dev.connect().timeout(Duration(seconds: 2)); // logger.i("Connected!"); // connectStatus = "Connected"; // // ???? WTF ???? // List svcs = await dev.discoverServices(); // dev.onServicesReset.listen((_) async { // logger.i("Services Reset"); // try { // List svcs = await dev.discoverServices(); // findCharac(svcs); // } catch (e) { // logger.e(e); // } // }); // logger.i("services discovered"); // findCharac(svcs); } catch (e) { logger.e(e); // dev.disconnect().ignore(); connectStatus = e.toString(); } finally { backActive = true; if (mounted) { setState(() {}); } } } // void findCharac(List svcs) { // if (svcs.isEmpty) { // connectStatus += ", No services found!"; // return; // } // connectStatus += ", Services found!"; // BluetoothService? badgeService = svcs.firstWhereOrNull( // (s) => s.serviceUuid.str == "ca260000-b4bb-46b2-bd06-b7b7a61ea990", // ); // if (badgeService == null) { // } else { // logger.i("badge service found"); // current = badgeService.characteristics.firstWhereOrNull( // (c) => // c.characteristicUuid.str == "ca260001-b4bb-46b2-bd06-b7b7a61ea990", // ); // available = badgeService.characteristics.firstWhereOrNull( // (c) => // c.characteristicUuid.str == "ca260002-b4bb-46b2-bd06-b7b7a61ea990", // ); // } // if (current == null || available == null) { // } else { // logger.i("characteristics found"); // } // } }