// 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");
// }
// }
}