From ec3cff5aa6e0e5ce436246be30598c6d0fe49960 Mon Sep 17 00:00:00 2001 From: uvok Date: Sat, 2 Aug 2025 11:54:29 +0200 Subject: Extract motiv parsing to mixin --- lib/model/motive_selection/badge_parser.dart | 37 ++++++++++++++++++++++ .../flutter_blue_plus_motive_selection.dart | 20 ++++-------- .../universal_blue_motive_selection.dart | 18 +++-------- 3 files changed, 48 insertions(+), 27 deletions(-) create mode 100644 lib/model/motive_selection/badge_parser.dart diff --git a/lib/model/motive_selection/badge_parser.dart b/lib/model/motive_selection/badge_parser.dart new file mode 100644 index 0000000..e1a7b5c --- /dev/null +++ b/lib/model/motive_selection/badge_parser.dart @@ -0,0 +1,37 @@ +// 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:convert'; + +import 'package:uvok_epaper_badge/model/badge_motive.dart'; +import 'package:uvok_epaper_badge/string_ext.dart'; + +mixin BadgeParser { + List parseBadgeMotives(List val) { + var templates = ascii.decode(val); + var x = templates + .split(";") + .where((s) => s.isNotEmpty) + .map((String s) { + List parts = s.splitFirst("-"); + if (parts.length != 2) { + return BadgeMotive(-1, "Invalid value"); + } + return BadgeMotive(int.tryParse(parts[0]) ?? -1, parts[1]); + }) + .toList(growable: false); + return x; + } +} diff --git a/lib/model/motive_selection/flutter_blue_plus_motive_selection.dart b/lib/model/motive_selection/flutter_blue_plus_motive_selection.dart index 1f86936..4046d83 100644 --- a/lib/model/motive_selection/flutter_blue_plus_motive_selection.dart +++ b/lib/model/motive_selection/flutter_blue_plus_motive_selection.dart @@ -17,12 +17,14 @@ import 'dart:convert'; import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:uvok_epaper_badge/model/device/flutter_blue_plus_device.dart'; -import 'package:uvok_epaper_badge/string_ext.dart'; +import 'package:uvok_epaper_badge/model/motive_selection/badge_parser.dart'; import 'package:uvok_epaper_badge/badge_exception.dart'; import 'package:uvok_epaper_badge/model/badge_motive.dart'; import 'package:uvok_epaper_badge/model/motive_selection/badge_motive_selection.dart'; -class FlutterBluePlusMotiveSelection implements BadgeMotiveSelection { +class FlutterBluePlusMotiveSelection + with BadgeParser + implements BadgeMotiveSelection { final FlutterBluePlusDevice _device; final String _badgeService = "ca260000-b4bb-46b2-bd06-b7b7a61ea990"; final String _currentMotiveCharacteristic = @@ -87,18 +89,8 @@ class FlutterBluePlusMotiveSelection implements BadgeMotiveSelection { (c) => c.characteristicUuid.str == _availableMotivesCharacteristic, ); var val = await c.read(); - var templates = ascii.decode(val); - _cachedMotives = templates - .split(";") - .where((s) => s.isNotEmpty) - .map((String s) { - List parts = s.splitFirst("-"); - if (parts.length != 2) { - return BadgeMotive(-1, "Invalid value"); - } - return BadgeMotive(int.tryParse(parts[0]) ?? -1, parts[1]); - }) - .toList(growable: false); + List x = parseBadgeMotives(val); + _cachedMotives = x; } on StateError { throw BadgeException("Characeristic/Service not found."); } diff --git a/lib/model/motive_selection/universal_blue_motive_selection.dart b/lib/model/motive_selection/universal_blue_motive_selection.dart index 607d429..43edd79 100644 --- a/lib/model/motive_selection/universal_blue_motive_selection.dart +++ b/lib/model/motive_selection/universal_blue_motive_selection.dart @@ -16,13 +16,16 @@ import 'dart:convert'; import 'package:universal_ble/universal_ble.dart'; +import 'package:uvok_epaper_badge/model/motive_selection/badge_parser.dart'; import 'package:uvok_epaper_badge/string_ext.dart'; import 'package:uvok_epaper_badge/badge_exception.dart'; import 'package:uvok_epaper_badge/model/badge_motive.dart'; import 'package:uvok_epaper_badge/model/device/universal_ble_device.dart'; import 'package:uvok_epaper_badge/model/motive_selection/badge_motive_selection.dart'; -class UniversalBlueMotiveSelection implements BadgeMotiveSelection { +class UniversalBlueMotiveSelection + with BadgeParser + implements BadgeMotiveSelection { final UniversalBleDevice _device; final String _badgeService = "ca260000-b4bb-46b2-bd06-b7b7a61ea990"; final String _currentMotiveCharacteristic = @@ -78,18 +81,7 @@ class UniversalBlueMotiveSelection implements BadgeMotiveSelection { service: _badgeService, ); var val = await c.read(); - var templates = ascii.decode(val); - _cachedMotives = templates - .split(";") - .where((s) => s.isNotEmpty) - .map((String s) { - List parts = s.splitFirst("-"); - if (parts.length != 2) { - return BadgeMotive(-1, "Invalid value"); - } - return BadgeMotive(int.tryParse(parts[0]) ?? -1, parts[1]); - }) - .toList(growable: false); + _cachedMotives = parseBadgeMotives(val); } on NotFoundException { throw BadgeException("Characeristic/Service not found."); } -- cgit v1.2.3