Resolves #114 Error going back from settings
This commit is contained in:
		@@ -37,15 +37,18 @@ class HomeAssistant {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  EntityCollection get entities => _entities;
 | 
					  EntityCollection get entities => _entities;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  HomeAssistant(String url, String password, String authType) {
 | 
					  HomeAssistant() {
 | 
				
			||||||
    _hassioAPIEndpoint = url;
 | 
					 | 
				
			||||||
    _hassioPassword = password;
 | 
					 | 
				
			||||||
    _hassioAuthType = authType;
 | 
					 | 
				
			||||||
    _entities = EntityCollection();
 | 
					    _entities = EntityCollection();
 | 
				
			||||||
    _uiBuilder = UIBuilder();
 | 
					    _uiBuilder = UIBuilder();
 | 
				
			||||||
    _messageQueue = SendMessageQueue(messageExpirationTime);
 | 
					    _messageQueue = SendMessageQueue(messageExpirationTime);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  void updateConnectionSettings(String url, String password, String authType) {
 | 
				
			||||||
 | 
					    _hassioAPIEndpoint = url;
 | 
				
			||||||
 | 
					    _hassioPassword = password;
 | 
				
			||||||
 | 
					    _hassioAuthType = authType;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Future fetch() {
 | 
					  Future fetch() {
 | 
				
			||||||
    if ((_fetchCompleter != null) && (!_fetchCompleter.isCompleted)) {
 | 
					    if ((_fetchCompleter != null) && (!_fetchCompleter.isCompleted)) {
 | 
				
			||||||
      TheLogger.log("Warning","Previous fetch is not complited");
 | 
					      TheLogger.log("Warning","Previous fetch is not complited");
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										141
									
								
								lib/main.dart
									
									
									
									
									
								
							
							
						
						
									
										141
									
								
								lib/main.dart
									
									
									
									
									
								
							@@ -88,6 +88,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
 | 
				
			|||||||
  HomeAssistant _homeAssistant;
 | 
					  HomeAssistant _homeAssistant;
 | 
				
			||||||
  EntityCollection _entities;
 | 
					  EntityCollection _entities;
 | 
				
			||||||
  //Map _instanceConfig;
 | 
					  //Map _instanceConfig;
 | 
				
			||||||
 | 
					  String _apiEndpoint;
 | 
				
			||||||
 | 
					  String _apiPassword;
 | 
				
			||||||
 | 
					  String _authType;
 | 
				
			||||||
  int _uiViewsCount = 0;
 | 
					  int _uiViewsCount = 0;
 | 
				
			||||||
  String _instanceHost;
 | 
					  String _instanceHost;
 | 
				
			||||||
  int _errorCodeToBeShown = 0;
 | 
					  int _errorCodeToBeShown = 0;
 | 
				
			||||||
@@ -107,14 +110,35 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
 | 
				
			|||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
    super.initState();
 | 
					    super.initState();
 | 
				
			||||||
    WidgetsBinding.instance.addObserver(this);
 | 
					    WidgetsBinding.instance.addObserver(this);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _homeAssistant = HomeAssistant();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _settingsSubscription = eventBus.on<SettingsChangedEvent>().listen((event) {
 | 
					    _settingsSubscription = eventBus.on<SettingsChangedEvent>().listen((event) {
 | 
				
			||||||
      TheLogger.log("Debug","Settings change event: reconnect=${event.reconnect}");
 | 
					      TheLogger.log("Debug","Settings change event: reconnect=${event.reconnect}");
 | 
				
			||||||
      setState(() {
 | 
					      if (event.reconnect) {
 | 
				
			||||||
        _errorCodeToBeShown = 0;
 | 
					        _homeAssistant.closeConnection();
 | 
				
			||||||
      });
 | 
					        _initConnection().then((b){
 | 
				
			||||||
      _initConnection();
 | 
					          setState(() {
 | 
				
			||||||
 | 
					            _homeAssistant.updateConnectionSettings(_apiEndpoint, _apiPassword, _authType);
 | 
				
			||||||
 | 
					            _errorCodeToBeShown = 10;
 | 
				
			||||||
 | 
					            _lastErrorMessage = "Connection settings was changed.";
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          }, onError: (_) {
 | 
				
			||||||
 | 
					            setState(() {
 | 
				
			||||||
 | 
					              _lastErrorMessage = _;
 | 
				
			||||||
 | 
					              _errorCodeToBeShown = 5;
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    _initConnection().then((_){
 | 
				
			||||||
 | 
					      _createConnection();
 | 
				
			||||||
 | 
					    }, onError: (_) {
 | 
				
			||||||
 | 
					      setState(() {
 | 
				
			||||||
 | 
					        _lastErrorMessage = _;
 | 
				
			||||||
 | 
					        _errorCodeToBeShown = 5;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    _initConnection();
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
@@ -130,62 +154,62 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
 | 
				
			|||||||
    String domain = prefs.getString('hassio-domain');
 | 
					    String domain = prefs.getString('hassio-domain');
 | 
				
			||||||
    String port = prefs.getString('hassio-port');
 | 
					    String port = prefs.getString('hassio-port');
 | 
				
			||||||
    _instanceHost = "$domain:$port";
 | 
					    _instanceHost = "$domain:$port";
 | 
				
			||||||
    String apiEndpoint = "${prefs.getString('hassio-protocol')}://$domain:$port/api/websocket";
 | 
					    _apiEndpoint = "${prefs.getString('hassio-protocol')}://$domain:$port/api/websocket";
 | 
				
			||||||
    homeAssistantWebHost = "${prefs.getString('hassio-res-protocol')}://$domain:$port";
 | 
					    homeAssistantWebHost = "${prefs.getString('hassio-res-protocol')}://$domain:$port";
 | 
				
			||||||
    String apiPassword = prefs.getString('hassio-password');
 | 
					    _apiPassword = prefs.getString('hassio-password');
 | 
				
			||||||
    String authType = prefs.getString('hassio-auth-type');
 | 
					    _authType = prefs.getString('hassio-auth-type');
 | 
				
			||||||
    if ((domain == null) || (port == null) || (apiPassword == null) ||
 | 
					    if ((domain == null) || (port == null) || (_apiPassword == null) ||
 | 
				
			||||||
        (domain.length == 0) || (port.length == 0) || (apiPassword.length == 0)) {
 | 
					        (domain.length == 0) || (port.length == 0) || (_apiPassword.length == 0)) {
 | 
				
			||||||
      setState(() {
 | 
					      throw("Check connection settings");
 | 
				
			||||||
        _errorCodeToBeShown = 5;
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      if (_homeAssistant != null) _homeAssistant.closeConnection();
 | 
					 | 
				
			||||||
      _createConnection(apiEndpoint, apiPassword, authType);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _createConnection(String apiEndpoint, String apiPassword, String authType) {
 | 
					  _createConnection() {
 | 
				
			||||||
    _homeAssistant = HomeAssistant(apiEndpoint, apiPassword, authType);
 | 
					 | 
				
			||||||
    _refreshData();
 | 
					    _refreshData();
 | 
				
			||||||
    if (_stateSubscription != null) _stateSubscription.cancel();
 | 
					    if (_stateSubscription == null) {
 | 
				
			||||||
    _stateSubscription = eventBus.on<StateChangedEvent>().listen((event) {
 | 
					      _stateSubscription = eventBus.on<StateChangedEvent>().listen((event) {
 | 
				
			||||||
      setState(() {
 | 
					        setState(() {
 | 
				
			||||||
        if (event.localChange) {
 | 
					          if (event.localChange) {
 | 
				
			||||||
          _entities
 | 
					            _entities
 | 
				
			||||||
              .get(event.entityId)
 | 
					                .get(event.entityId)
 | 
				
			||||||
              .state = event.newState;
 | 
					                .state = event.newState;
 | 
				
			||||||
        }
 | 
					          }
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    });
 | 
					    }
 | 
				
			||||||
    if (_serviceCallSubscription != null) _serviceCallSubscription.cancel();
 | 
					    if (_serviceCallSubscription == null) {
 | 
				
			||||||
    _serviceCallSubscription = eventBus.on<ServiceCallEvent>().listen((event) {
 | 
					      _serviceCallSubscription =
 | 
				
			||||||
      _callService(event.domain, event.service, event.entityId, event.additionalParams);
 | 
					          eventBus.on<ServiceCallEvent>().listen((event) {
 | 
				
			||||||
    });
 | 
					            _callService(event.domain, event.service, event.entityId,
 | 
				
			||||||
 | 
					                event.additionalParams);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (_showEntityPageSubscription != null) _showEntityPageSubscription.cancel();
 | 
					    if (_showEntityPageSubscription == null) {
 | 
				
			||||||
    _showEntityPageSubscription = eventBus.on<ShowEntityPageEvent>().listen((event) {
 | 
					      _showEntityPageSubscription =
 | 
				
			||||||
      _showEntityPage(event.entity);
 | 
					          eventBus.on<ShowEntityPageEvent>().listen((event) {
 | 
				
			||||||
    });
 | 
					            _showEntityPage(event.entity);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _refreshData() async {
 | 
					  _refreshData() async {
 | 
				
			||||||
 | 
					    _homeAssistant.updateConnectionSettings(_apiEndpoint, _apiPassword, _authType);
 | 
				
			||||||
    setState(() {
 | 
					    setState(() {
 | 
				
			||||||
      _isLoading = true;
 | 
					      _isLoading = true;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    _errorCodeToBeShown = 0;
 | 
					    _errorCodeToBeShown = 0;
 | 
				
			||||||
    if (_homeAssistant != null) {
 | 
					    _lastErrorMessage = "";
 | 
				
			||||||
      await _homeAssistant.fetch().then((result) {
 | 
					    await _homeAssistant.fetch().then((result) {
 | 
				
			||||||
        setState(() {
 | 
					      setState(() {
 | 
				
			||||||
          //_instanceConfig = _homeAssistant.instanceConfig;
 | 
					        //_instanceConfig = _homeAssistant.instanceConfig;
 | 
				
			||||||
          _entities = _homeAssistant.entities;
 | 
					        _entities = _homeAssistant.entities;
 | 
				
			||||||
          _uiViewsCount = _homeAssistant.viewsCount;
 | 
					        _uiViewsCount = _homeAssistant.viewsCount;
 | 
				
			||||||
          _isLoading = false;
 | 
					        _isLoading = false;
 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      }).catchError((e) {
 | 
					 | 
				
			||||||
        _setErrorState(e);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }).catchError((e) {
 | 
				
			||||||
 | 
					      _setErrorState(e);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  _setErrorState(e) {
 | 
					  _setErrorState(e) {
 | 
				
			||||||
@@ -483,6 +507,25 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
 | 
				
			|||||||
              HAUtils.launchURL("https://github.com/estevez-dev/ha_client_pub/issues/new");
 | 
					              HAUtils.launchURL("https://github.com/estevez-dev/ha_client_pub/issues/new");
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          ),
 | 
					          ),
 | 
				
			||||||
 | 
					          Container(
 | 
				
			||||||
 | 
					            height: 30.0,
 | 
				
			||||||
 | 
					            decoration: new BoxDecoration(
 | 
				
			||||||
 | 
					              border: new Border(
 | 
				
			||||||
 | 
					                  top: BorderSide(
 | 
				
			||||||
 | 
					                    width: 2.0,
 | 
				
			||||||
 | 
					                    color: Colors.black26,
 | 
				
			||||||
 | 
					                  )
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					              )
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					          new ListTile(
 | 
				
			||||||
 | 
					            leading: Icon(MaterialDesignIcons.createIconDataFromIconName("mdi:coffee")),
 | 
				
			||||||
 | 
					            title: Text("By me a coffee"),
 | 
				
			||||||
 | 
					            onTap: () {
 | 
				
			||||||
 | 
					              Navigator.of(context).pop();
 | 
				
			||||||
 | 
					              HAUtils.launchURL("https://www.buymeacoffee.com/estevez");
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
          new AboutListTile(
 | 
					          new AboutListTile(
 | 
				
			||||||
            applicationName: appName,
 | 
					            applicationName: appName,
 | 
				
			||||||
            applicationVersion: appVersion,
 | 
					            applicationVersion: appVersion,
 | 
				
			||||||
@@ -499,6 +542,8 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
 | 
				
			|||||||
      SnackBarAction action;
 | 
					      SnackBarAction action;
 | 
				
			||||||
      switch (_errorCodeToBeShown) {
 | 
					      switch (_errorCodeToBeShown) {
 | 
				
			||||||
        case 9:
 | 
					        case 9:
 | 
				
			||||||
 | 
					        case 11:
 | 
				
			||||||
 | 
					        case 7:
 | 
				
			||||||
        case 1: {
 | 
					        case 1: {
 | 
				
			||||||
            action = SnackBarAction(
 | 
					            action = SnackBarAction(
 | 
				
			||||||
                label: "Retry",
 | 
					                label: "Retry",
 | 
				
			||||||
@@ -533,9 +578,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver {
 | 
				
			|||||||
          break;
 | 
					          break;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        case 7: {
 | 
					        case 10: {
 | 
				
			||||||
          action = SnackBarAction(
 | 
					          action = SnackBarAction(
 | 
				
			||||||
            label: "Retry",
 | 
					            label: "Refresh",
 | 
				
			||||||
            onPressed: () {
 | 
					            onPressed: () {
 | 
				
			||||||
              _scaffoldKey?.currentState?.hideCurrentSnackBar();
 | 
					              _scaffoldKey?.currentState?.hideCurrentSnackBar();
 | 
				
			||||||
              _refreshData();
 | 
					              _refreshData();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,7 @@ class _ConnectionSettingsPageState extends State<ConnectionSettingsPage> {
 | 
				
			|||||||
  String _hassioPassword = "";
 | 
					  String _hassioPassword = "";
 | 
				
			||||||
  String _socketProtocol = "wss";
 | 
					  String _socketProtocol = "wss";
 | 
				
			||||||
  String _authType = "access_token";
 | 
					  String _authType = "access_token";
 | 
				
			||||||
 | 
					  bool _connectionSettingsChanged = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
  void initState() {
 | 
					  void initState() {
 | 
				
			||||||
@@ -45,6 +46,7 @@ class _ConnectionSettingsPageState extends State<ConnectionSettingsPage> {
 | 
				
			|||||||
    prefs.setString("hassio-protocol", _socketProtocol);
 | 
					    prefs.setString("hassio-protocol", _socketProtocol);
 | 
				
			||||||
    prefs.setString("hassio-res-protocol", _socketProtocol == "wss" ? "https" : "http");
 | 
					    prefs.setString("hassio-res-protocol", _socketProtocol == "wss" ? "https" : "http");
 | 
				
			||||||
    prefs.setString("hassio-auth-type", _authType);
 | 
					    prefs.setString("hassio-auth-type", _authType);
 | 
				
			||||||
 | 
					    _connectionSettingsChanged = true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @override
 | 
					  @override
 | 
				
			||||||
@@ -52,12 +54,24 @@ class _ConnectionSettingsPageState extends State<ConnectionSettingsPage> {
 | 
				
			|||||||
    return new Scaffold(
 | 
					    return new Scaffold(
 | 
				
			||||||
      appBar: new AppBar(
 | 
					      appBar: new AppBar(
 | 
				
			||||||
        leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: (){
 | 
					        leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: (){
 | 
				
			||||||
          _saveSettings().then((r){
 | 
					          Navigator.pop(context);
 | 
				
			||||||
            Navigator.pop(context);
 | 
					 | 
				
			||||||
          });
 | 
					 | 
				
			||||||
          eventBus.fire(SettingsChangedEvent(true));
 | 
					 | 
				
			||||||
        }),
 | 
					        }),
 | 
				
			||||||
        title: new Text(widget.title),
 | 
					        title: new Text(widget.title),
 | 
				
			||||||
 | 
					        actions: <Widget>[
 | 
				
			||||||
 | 
					          IconButton(
 | 
				
			||||||
 | 
					            icon: Icon(Icons.check),
 | 
				
			||||||
 | 
					            onPressed:(){
 | 
				
			||||||
 | 
					              if (_connectionSettingsChanged) {
 | 
				
			||||||
 | 
					                _saveSettings().then((r){
 | 
				
			||||||
 | 
					                  Navigator.pop(context);
 | 
				
			||||||
 | 
					                  eventBus.fire(SettingsChangedEvent(_connectionSettingsChanged));
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					              } else {
 | 
				
			||||||
 | 
					                Navigator.pop(context);
 | 
				
			||||||
 | 
					              }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          )
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
      ),
 | 
					      ),
 | 
				
			||||||
      body: ListView(
 | 
					      body: ListView(
 | 
				
			||||||
        padding: const EdgeInsets.all(20.0),
 | 
					        padding: const EdgeInsets.all(20.0),
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user