From 522bdef646ccefc8fb778e633301b76327595c33 Mon Sep 17 00:00:00 2001 From: Suraj Adhikari Date: Mon, 6 Dec 2021 08:31:29 -0600 Subject: [PATCH] fix: moved detail screen to device widget --- .../trait_based_device_notifier.dart | 6 +- lib/traits/detail_screen.dart | 129 ++++++++++++++++++ lib/traits/lock.dart | 77 +++++++++++ 3 files changed, 209 insertions(+), 3 deletions(-) create mode 100644 lib/traits/detail_screen.dart create mode 100644 lib/traits/lock.dart diff --git a/lib/providers/trait_based_device_notifier.dart b/lib/providers/trait_based_device_notifier.dart index b6421aea..4f7db229 100644 --- a/lib/providers/trait_based_device_notifier.dart +++ b/lib/providers/trait_based_device_notifier.dart @@ -21,7 +21,7 @@ class TraitBasedDeviceNotifier extends ChangeNotifier { } TraitBasedDeviceNotifier(Request request, String deviceId, - {GetDetailsFunction getDetails = DevicesRepository.getLockDetails}) { + {GetDetailsFunction getDetails = DevicesRepository.getDeviceDetails}) { _request = request; _deviceId = deviceId; fetchData(getDetails: getDetails); @@ -29,12 +29,12 @@ class TraitBasedDeviceNotifier extends ChangeNotifier { Future fetchData( {GetDetailsFunction getDetails = - DevicesRepository.getLockDetails}) async { + DevicesRepository.getDeviceDetails}) async { loadingDetail = true; notifyListeners(); _deviceDetail = await getDetails(_request, _deviceId); - + print(_deviceDetail!.traits.length); loadingDetail = false; notifyListeners(); diff --git a/lib/traits/detail_screen.dart b/lib/traits/detail_screen.dart new file mode 100644 index 00000000..cd1dd799 --- /dev/null +++ b/lib/traits/detail_screen.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:yonomi_device_widgets/providers/trait_based_device_notifier.dart'; +import 'package:yonomi_platform_sdk/yonomi-sdk.dart'; +import 'package:yonomi_platform_sdk/yonomi-sdk.dart' as yoSdk; + +class DetailScreen extends StatelessWidget { + final Request request; + final String deviceId; + + const DetailScreen({Key? key, required this.request, required this.deviceId}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return ChangeNotifierProvider( + create: (_) => TraitBasedDeviceNotifier(request, deviceId), + child: Consumer( + builder: (_, traitBasedDeviceNotifier, child) { + if (traitBasedDeviceNotifier.deviceDetail == null) { + return CircularProgressIndicator(); + } else { + return Column( + children: + traitBasedDeviceNotifier.deviceDetail!.traits.map((element) { + return Row( + children: [Text(element.name)], + ); + }).toList()); + } + }), + ); + } +} + +// class isPowered extends yoSdk.State { +// isPowered(bool isOn) : super("Power", isOn); +// } + +// class PowerTrait extends Trait { +// PowerTrait(String name, yoSdk.State state) : super(name, state); +// } + +// class TraitWidgetsBuilder { +// static Widget build(Device deviceDetail) { +// List dummyTraits = [ +// LockTrait("whenLocked", IsLocked(true)), +// LockTrait("whenUnlocked", IsLocked(false)), +// PowerTrait("PowerTrait", isPowered(true)), +// UnknownTrait(), +// ]; + +// // TODO: L41: use deviceDetail.traits, not dummyTraits; +// return Column( +// children: [ +// buildDeviceTitleRow(deviceDetail.displayName), +// ...buildTraitRows(dummyTraits), +// ], +// ); +// } + +// static Widget buildDeviceTitleRow(String deviceName) { +// return Row( +// children: [Text(deviceName)], +// ); +// } + +// static List buildTraitRows(List traits) { +// List traitRows = []; +// for (var trait in traits) { +// traitRows.add( +// Row( +// children: [traitFactory(trait)], +// ), +// ); +// } +// return traitRows; +// } + +// static Widget traitFactory(Trait trait) { +// switch (trait.runtimeType) { +// case LockTrait: +// return LockTraitWidget(trait); +// case PowerTrait: +// return PowerTraitWidget(trait); +// default: +// return UnknownTraitWidget(trait); +// } +// } +// } + +// class LockTraitWidget extends StatelessWidget { +// Trait trait; + +// LockTraitWidget(this.trait); + +// @override +// Widget build(BuildContext context) { +// return Text("Lock-based: ${this.trait.name}"); +// } +// } + +// class PowerTraitWidget extends StatelessWidget { +// Trait trait; + +// PowerTraitWidget(this.trait); + +// @override +// Widget build(BuildContext context) { +// return Text("Power Trait: ${this.trait.name}"); +// // return Switch( +// // value: false, +// // onChanged: (bool newValue) { +// // print("Switched ${newValue}"); +// // }, +// // ); +// } +// } + +// class UnknownTraitWidget extends StatelessWidget { +// Trait trait; + +// UnknownTraitWidget(this.trait); + +// @override +// Widget build(BuildContext context) { +// return Text("Unknown Trait: ${this.trait.name}"); +// } +// } diff --git a/lib/traits/lock.dart b/lib/traits/lock.dart new file mode 100644 index 00000000..d5ebdc6c --- /dev/null +++ b/lib/traits/lock.dart @@ -0,0 +1,77 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:yonomi_device_widgets/assets/traits/device_item_icon.dart'; +import 'package:yonomi_device_widgets/components/arc.dart'; +import 'package:yonomi_device_widgets/providers/lock_provider.dart'; +import 'package:yonomi_device_widgets/ui/widget_style_constants.dart'; + +class LockWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + final lockProvider = Provider.of(context, listen: true); + + return lockProvider.loadingDetail + ? Center(child: CircularProgressIndicator()) + : Scaffold( + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Row( + children: [ + Text( + lockProvider.deviceDetail.displayName, + style: Theme.of(context).textTheme.headline6, + ), + ], + ), + SizedBox( + height: 80, + ), + Center( + child: Arc( + showThumb: false, + centerWidget: SizedBox( + width: 175, + height: 175, + child: GestureDetector( + child: getLockStateIcon(lockProvider), + onTap: () => _lockTap(lockProvider), + )), + color: lockProvider.isLocked + ? WidgetStyleConstants.deviceDetailIconColorActive + : WidgetStyleConstants.deviceDetailIconColorInactive, + initialValue: 0.0, + maxValue: 1.0, + onFinalSetPoint: (double value) {}, + ), + ), + SizedBox( + height: 80, + ), + CupertinoSwitch( + onChanged: (bool value) { + _lockTap(lockProvider); + }, + value: lockProvider.isLocked, + ), + ], + ), + ); + } + + Widget getLockStateIcon(LockProvider lockProvider) { + return (lockProvider.loadingDetail || lockProvider.loadingAction) + ? Center(child: CircularProgressIndicator()) + : (lockProvider.isLocked) + ? DeviceItemIcon.buildLockIcon( + 175, WidgetStyleConstants.deviceDetailIconColorActive) + : DeviceItemIcon.buildUnlockIcon( + 175, WidgetStyleConstants.deviceDetailIconColorInactive); + } + + void _lockTap(LockProvider provider) { + bool setLock = !provider.isLocked; + provider.setLockUnlockAction(provider.deviceDetail.id, setLock); + } +}