From e501169f5f6d14a52468fc05995e5d6678b80b38 Mon Sep 17 00:00:00 2001 From: "Rigoberto L. Perez" Date: Wed, 22 Dec 2021 15:21:57 -0500 Subject: [PATCH] feat(detail_screen.dart,pubspec.yaml): Use accordions for subtraits --- lib/traits/detail_screen.dart | 103 +++++++++++++++++++++++++++------- pubspec.yaml | 3 +- 2 files changed, 84 insertions(+), 22 deletions(-) diff --git a/lib/traits/detail_screen.dart b/lib/traits/detail_screen.dart index 3204e3c7..4bac03b9 100644 --- a/lib/traits/detail_screen.dart +++ b/lib/traits/detail_screen.dart @@ -1,13 +1,17 @@ +import 'package:accordion/accordion.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; -import 'package:yonomi_device_widgets/assets/traits/unknown_item_icon.dart'; import 'package:yonomi_device_widgets/providers/battery_level_trait_provider.dart'; import 'package:yonomi_device_widgets/providers/lock_provider.dart'; import 'package:yonomi_device_widgets/providers/power_trait_provider.dart'; import 'package:yonomi_device_widgets/providers/trait_detail_provider.dart'; import 'package:yonomi_device_widgets/assets/traits/battery_level_icon.dart'; +import 'package:yonomi_device_widgets/assets/traits/lock_item_icon.dart'; +import 'package:yonomi_device_widgets/assets/traits/unknown_item_icon.dart'; +import 'package:yonomi_device_widgets/assets/traits/power_item_icon.dart'; import 'package:yonomi_device_widgets/traits/lock.dart'; import 'package:yonomi_device_widgets/traits/power_widget.dart'; +import 'package:yonomi_device_widgets/traits/battery_widget.dart'; import 'package:yonomi_platform_sdk/yonomi-sdk.dart'; import 'package:yonomi_device_widgets/ui/widget_style_constants.dart'; @@ -59,17 +63,25 @@ class DetailScreenWidget extends StatelessWidget { Widget buildContainer(List traits) { return Container( - alignment: Alignment.center, - child: Center( - child: Column( - children: traits.map((element) { - return Row(children: [ - SizedBox(width: 50), - createTraitWidget(element.name), - ]); - }).toList()), - ), - ); + alignment: Alignment.center, + child: Center( + child: Column(children: [ + createTraitWidget(traits.first.name), + Accordion( + maxOpenSections: 1, + headerPadding: EdgeInsets.symmetric(vertical: 8, horizontal: 15), + children: traits.skip(1).map((trait) { + return AccordionSection( + header: createTraitWidgetHeader(trait.name), + content: createTraitWidget(trait.name), + contentHorizontalPadding: 20, + contentBorderWidth: 1, + contentBorderColor: Colors.white, + headerBackgroundColor: Colors.white, + contentBackgroundColor: Color(0xFF2e2e2e), + ); + }).toList()) + ]))); } Widget createTraitWidget(String name) { @@ -90,21 +102,70 @@ class DetailScreenWidget extends StatelessWidget { }); case 'battery_level': return Consumer( - builder: (_, batteryLevelProvider, child) { + builder: (_, batteryLevelTraitProvider, child) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: BatteryWidget(batteryLevelTraitProvider), + ); + }); + default: + return Padding( + padding: const EdgeInsets.all(8.0), + child: UnknownItemIcon(color: Colors.white)); + } + } + + Widget createTraitWidgetHeader(String name) { + switch (name) { + case 'lock': + return Consumer(builder: (_, lockProvider, child) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + LockIcon(lockProvider.isLocked, size: 20.0), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text(lockProvider.getLockTrait().name, + style: TextStyle(fontSize: 20, color: Colors.black))), + ], + )); + }); + case 'power': + return Consumer(builder: (_, powerProvider, child) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Row( + children: [ + PowerItemIcon(powerProvider.getOnOffState, size: 20.0), + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + (powerProvider.getPowerTrait()?.name ?? + 'Power Switch'), + style: TextStyle(fontSize: 20))), + ], + )); + }); + case 'battery_level': + return Consumer( + builder: (_, batteryLevelTraitProvider, child) { return Padding( padding: const EdgeInsets.all(8.0), child: Row( children: [ BatteryLevelIcon( - batteryLevelProvider.getBatteryLevel, + batteryLevelTraitProvider.getBatteryLevel, size: 20.0, - color: Colors.white, ), Padding( padding: const EdgeInsets.all(8.0), child: Text( - 'Battery Level: ${batteryLevelProvider.getBatteryLevel}%', - style: TextStyle(fontSize: 20, color: _getBatteryLevelColor(batteryLevelProvider.getBatteryLevel))), + 'Battery Level: ${batteryLevelTraitProvider.getBatteryLevel}%', + style: TextStyle( + fontSize: 20, + color: _getBatteryLevelColor( + batteryLevelTraitProvider.getBatteryLevel))), ), ], ), @@ -117,11 +178,11 @@ class DetailScreenWidget extends StatelessWidget { children: [ UnknownItemIcon( size: 20.0, - color: Colors.white, ), Padding( padding: const EdgeInsets.all(8.0), - child: Text(name, style: TextStyle(fontSize: 20)), + child: Text(name, + style: TextStyle(fontSize: 20, color: Colors.black)), ), ], ), @@ -129,13 +190,13 @@ class DetailScreenWidget extends StatelessWidget { } } - Color _getBatteryLevelColor(int batteryLevel) { + static Color _getBatteryLevelColor(int batteryLevel) { if (batteryLevel >= WidgetStyleConstants.batteryFullMin) { return WidgetStyleConstants.globalSuccessColor; } else if (batteryLevel <= WidgetStyleConstants.batteryLowMax) { return WidgetStyleConstants.globalWarningColor; } else { - return Colors.white; + return Colors.black; } } } diff --git a/pubspec.yaml b/pubspec.yaml index c52365a2..48aa91a6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,8 @@ dependencies: flutter: sdk: flutter bootstrap_icons: ^1.5.0 - yonomi_platform_sdk: ^2.2.0 + yonomi_platform_sdk: + path: ../yonomi-sdk-dart dev_dependencies: mockito: ^5.0.15