| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| part of fitness; |
| |
| typedef void SettingsUpdater({ |
| BackupMode backup, |
| double goalWeight |
| }); |
| |
| class SettingsFragment extends StatefulComponent { |
| SettingsFragment({ this.userData, this.updater }); |
| |
| final UserData userData; |
| final SettingsUpdater updater; |
| |
| SettingsFragmentState createState() => new SettingsFragmentState(); |
| } |
| |
| class SettingsFragmentState extends State<SettingsFragment> { |
| void _handleBackupChanged(bool value) { |
| assert(config.updater != null); |
| config.updater(backup: value ? BackupMode.enabled : BackupMode.disabled); |
| } |
| |
| Widget buildToolBar() { |
| return new ToolBar( |
| center: new Text('Settings') |
| ); |
| } |
| |
| String get goalWeightText { |
| if (config.userData.goalWeight == null || config.userData.goalWeight == 0.0) |
| return "None"; |
| return "${config.userData.goalWeight}"; |
| } |
| |
| static final GlobalKey weightGoalKey = new GlobalKey(); |
| |
| double _goalWeight; |
| |
| void _handleGoalWeightChanged(String goalWeight) { |
| // TODO(jackson): Looking for null characters to detect enter key is a hack |
| if (goalWeight.endsWith("\u{0}")) { |
| Navigator.pop(context, double.parse(goalWeight.replaceAll("\u{0}", ""))); |
| } else { |
| setState(() { |
| try { |
| _goalWeight = double.parse(goalWeight); |
| } on FormatException { |
| _goalWeight = 0.0; |
| } |
| }); |
| } |
| } |
| |
| Future _handleGoalWeightPressed() async { |
| double goalWeight = await showDialog( |
| context: context, |
| child: new Dialog( |
| title: new Text("Goal Weight"), |
| content: new Input( |
| key: weightGoalKey, |
| placeholder: 'Goal weight in lbs', |
| keyboardType: KeyboardType.NUMBER, |
| onChanged: _handleGoalWeightChanged |
| ), |
| actions: <Widget>[ |
| new FlatButton( |
| child: new Text('CANCEL'), |
| onPressed: () { |
| Navigator.pop(context); |
| } |
| ), |
| new FlatButton( |
| child: new Text('SAVE'), |
| onPressed: () { |
| Navigator.pop(context, _goalWeight); |
| } |
| ), |
| ] |
| ) |
| ); |
| config.updater(goalWeight: goalWeight); |
| } |
| |
| Widget buildSettingsPane(BuildContext context) { |
| return new Block(<Widget>[ |
| new DrawerItem( |
| onPressed: () { _handleBackupChanged(!(config.userData.backupMode == BackupMode.enabled)); }, |
| child: new Row(<Widget>[ |
| new Flexible(child: new Text('Back up data to the cloud')), |
| new Switch(value: config.userData.backupMode == BackupMode.enabled, onChanged: _handleBackupChanged), |
| ]) |
| ), |
| new DrawerItem( |
| onPressed: () => _handleGoalWeightPressed(), |
| child: new Column(<Widget>[ |
| new Text('Goal Weight'), |
| new Text(goalWeightText, style: Theme.of(context).text.caption), |
| ], |
| alignItems: FlexAlignItems.start |
| ) |
| ), |
| ], |
| padding: const EdgeDims.symmetric(vertical: 20.0) |
| ); |
| } |
| |
| Widget build(BuildContext context) { |
| return new Scaffold( |
| toolBar: buildToolBar(), |
| body: buildSettingsPane(context) |
| ); |
| } |
| } |