part of '../main.dart'; class ConnectionSettingsPage extends StatefulWidget { ConnectionSettingsPage({Key key, this.title}) : super(key: key); final String title; @override _ConnectionSettingsPageState createState() => new _ConnectionSettingsPageState(); } class _ConnectionSettingsPageState extends State { String _hassioDomain = ""; String _newHassioDomain = ""; String _hassioPort = ""; String _newHassioPort = ""; String _socketProtocol = "wss"; String _newSocketProtocol = "wss"; String _longLivedToken = ""; String _newLongLivedToken = ""; bool _useLovelace = true; bool _newUseLovelace = true; String oauthUrl; bool useOAuth = false; @override void initState() { super.initState(); _loadSettings(); } _loadSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); final storage = new FlutterSecureStorage(); try { useOAuth = prefs.getBool("oauth-used") ?? true; } catch (e) { useOAuth = true; } if (!useOAuth) { try { _longLivedToken = _newLongLivedToken = await storage.read(key: "hacl_llt"); } catch (e) { _longLivedToken = _newLongLivedToken = ""; await storage.delete(key: "hacl_llt"); } } setState(() { _hassioDomain = _newHassioDomain = prefs.getString("hassio-domain")?? ""; _hassioPort = _newHassioPort = prefs.getString("hassio-port") ?? ""; _socketProtocol = _newSocketProtocol = prefs.getString("hassio-protocol") ?? 'wss'; try { _useLovelace = _newUseLovelace = prefs.getBool("use-lovelace") ?? true; } catch (e) { _useLovelace = _newUseLovelace = true; } }); } bool _checkConfigChanged() { return ( (_newHassioPort != _hassioPort) || (_newHassioDomain != _hassioDomain) || (_newSocketProtocol != _socketProtocol) || (_newUseLovelace != _useLovelace) || (_newLongLivedToken != _longLivedToken)); } _saveSettings() async { if (_newHassioDomain.indexOf("http") == 0 && _newHassioDomain.indexOf("//") > 0) { _newHassioDomain = _newHassioDomain.split("//")[1]; } _newHassioDomain = _newHassioDomain.split("/")[0]; SharedPreferences prefs = await SharedPreferences.getInstance(); final storage = new FlutterSecureStorage(); if (_newLongLivedToken.isNotEmpty) { prefs.setBool("oauth-used", false); await storage.write(key: "hacl_llt", value: _newLongLivedToken); } else if (!useOAuth) { await storage.delete(key: "hacl_llt"); } prefs.setString("hassio-domain", _newHassioDomain); prefs.setString("hassio-port", _newHassioPort); prefs.setString("hassio-protocol", _newSocketProtocol); prefs.setString("hassio-res-protocol", _newSocketProtocol == "wss" ? "https" : "http"); prefs.setBool("use-lovelace", _newUseLovelace); } @override Widget build(BuildContext context) { return new Scaffold( appBar: new AppBar( leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: (){ Navigator.pop(context); }), title: new Text(widget.title), actions: [ IconButton( icon: Icon(Icons.check), onPressed: (){ if (_checkConfigChanged()) { Logger.d("Settings changed. Saving..."); _saveSettings().then((r) { Navigator.pop(context); eventBus.fire(SettingsChangedEvent(true)); }); } else { Logger.d("Settings was not changed"); Navigator.pop(context); } } ) ], ), body: ListView( scrollDirection: Axis.vertical, padding: const EdgeInsets.all(20.0), children: [ Text( "Connection settings", style: TextStyle( color: Colors.black45, fontSize: 20.0 ), ), new Row( children: [ Text("Use ssl (HTTPS)"), Switch( value: (_newSocketProtocol == "wss"), onChanged: (value) { setState(() { _newSocketProtocol = value ? "wss" : "ws"; }); }, ) ], ), new TextField( decoration: InputDecoration( labelText: "Home Assistant domain or ip address" ), controller: new TextEditingController.fromValue( new TextEditingValue( text: _newHassioDomain, selection: new TextSelection.collapsed(offset: _newHassioDomain.length) ) ), onChanged: (value) { _newHassioDomain = value; } ), new TextField( decoration: InputDecoration( labelText: "Home Assistant port (default is 8123)" ), controller: new TextEditingController.fromValue( new TextEditingValue( text: _newHassioPort, selection: new TextSelection.collapsed(offset: _newHassioPort.length) ) ), onChanged: (value) { _newHassioPort = value; } ), new Text( "Try ports 80 and 443 if default is not working and you don't know why.", style: TextStyle(color: Colors.grey), ), Padding( padding: EdgeInsets.only(top: 20.0), child: Text( "UI", style: TextStyle( color: Colors.black45, fontSize: 20.0 ), ), ), new Row( children: [ Text("Use Lovelace UI"), Switch( value: _newUseLovelace, onChanged: (value) { setState(() { _newUseLovelace = value; }); }, ) ], ), Text( "Authentication settings", style: TextStyle( color: Colors.black45, fontSize: 20.0 ), ), Container(height: 10.0,), Text( "You can leave this field blank to make app generate new long-lived token automatically by asking you to login to your Home Assistant. Use this field only if you still want to use manually generated long-lived token. Leave it blank if you don't understand what we are talking about.", style: TextStyle(color: Colors.redAccent), ), new TextField( decoration: InputDecoration( labelText: "Long-lived token" ), controller: new TextEditingController.fromValue( new TextEditingValue( text: _newLongLivedToken ?? '', selection: new TextSelection.collapsed(offset: _newLongLivedToken != null ? _newLongLivedToken.length : 0) ) ), onChanged: (value) { _newLongLivedToken = value; } ), ], ), ); } @override void dispose() { super.dispose(); } }