// 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 'dart:ui';
import 'package:uvok_epaper_badge/model/badge_motive_selection_factory.dart';
import 'package:uvok_epaper_badge/model/device/device.dart';
import 'package:flutter/material.dart';
import 'package:logger/logger.dart';
import 'package:uvok_epaper_badge/model/connection/device_connection.dart';
import 'package:uvok_epaper_badge/model/motive_selection/badge_motive_selection.dart';
import 'package:uvok_epaper_badge/view_model/badge_motive_view_model.dart';
import 'package:uvok_epaper_badge/widgets/badge_motive_list.dart';
var logger = Logger();
class DeviceDetailsScreen extends StatefulWidget {
final Device device;
final DeviceConnection deviceConnection;
late final BadgeMotiveSelection _motiveSelection;
late final BadgeMotiveViewModel _motiveVM;
DeviceDetailsScreen({
super.key,
required this.device,
required this.deviceConnection,
}) {
_motiveSelection = BadgeMotiveSelectionFactory.createBadgeMotiveSelection(
device,
);
_motiveVM = BadgeMotiveViewModel(motivSelect: _motiveSelection);
}
@override
State createState() {
return DeviceDetailsState();
}
}
class DeviceDetailsState extends State {
late final AppLifecycleListener appLL;
/// Whether the back button should be active.
bool backActive = false;
DeviceDetailsState() {
appLL = AppLifecycleListener(
onExitRequested: () async {
logger.i("Exit requested");
dispose();
return AppExitResponse.exit;
},
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text("Device details"),
),
body: Center(
child: ValueListenableBuilder(
valueListenable: widget.deviceConnection.status,
builder: (connCtx, ConnectionStatus value, child) {
return Column(
spacing: 20,
children: [
SizedBox(height: 20),
Text("Connection state: ${value.toString()}"),
ElevatedButton(
child: Text("Refresh"),
onPressed: () async {
await widget._motiveVM.updateMotives();
await widget._motiveVM.getCurrentMotive();
},
),
ListenableBuilder(
listenable: widget._motiveVM,
builder: (errorCtx, child) {
if (widget._motiveVM.errorMessage != null) {
var theme = Theme.of(errorCtx);
return Text(
widget._motiveVM.errorMessage!,
style: TextStyle(
color: theme.colorScheme.error,
fontWeight: FontWeight.bold,
),
);
}
return Container();
},
),
BadgeMotiveList(motiveVM: widget._motiveVM),
],
);
},
),
),
);
}
@override
void initState() {
super.initState();
_doConnect();
}
@override
void deactivate() {
logger.i("(widget deactivate)");
// widget.device.disconnect().ignore();
super.deactivate();
}
@override
void dispose() {
logger.i("(widget dispose)");
widget.deviceConnection.disconnect().ignore();
super.dispose();
}
void _doConnect() async {
try {
logger.i("Try to connect...");
await widget.deviceConnection.connect();
} catch (e) {
logger.e(e);
await widget.deviceConnection.disconnect();
} finally {
backActive = true;
}
}
}