Resolves #341 Add logout

This commit is contained in:
estevez-dev 2019-03-21 14:08:07 +02:00
parent 20d3498bfd
commit b7d5a53e86
3 changed files with 57 additions and 28 deletions

View File

@ -48,6 +48,9 @@ class HomeAssistant {
} }
String get userName => _userName ?? locationName; String get userName => _userName ?? locationName;
String get userAvatarText => userName.length > 0 ? userName[0] : ""; String get userAvatarText => userName.length > 0 ? userName[0] : "";
bool get isNoEntities => entities == null || entities.isEmpty;
bool get isNoViews => ui == null || ui.isEmpty;
bool get isAuthenticated => _token != null;
//int get viewsCount => entities.views.length ?? 0; //int get viewsCount => entities.views.length ?? 0;
HomeAssistant() { HomeAssistant() {
@ -106,14 +109,14 @@ class HomeAssistant {
return _fetchCompleter.future; return _fetchCompleter.future;
} }
disconnect() async { Future disconnect() async {
Logger.d( "Socket disconnecting..."); Logger.d( "Socket disconnecting...");
await _socketSubscription?.cancel(); await _socketSubscription?.cancel();
await _hassioChannel?.sink?.close()?.timeout(Duration(seconds: 3), await _hassioChannel?.sink?.close()?.timeout(Duration(seconds: 4),
onTimeout: () => Logger.d( "Socket sink closed") onTimeout: () => Logger.d( "Socket sink close timeout")
); );
_hassioChannel = null; _hassioChannel = null;
Logger.d( "..Disconnected");
} }
Future _connection() { Future _connection() {
@ -263,10 +266,12 @@ class HomeAssistant {
} }
Future logout() async { Future logout() async {
Logger.d("Logging out...");
_token = null; _token = null;
_tempToken = null; _tempToken = null;
//TODO proper clear
await SharedPreferences.getInstance().then((prefs) => prefs.remove("hassio-token")); await SharedPreferences.getInstance().then((prefs) => prefs.remove("hassio-token"));
ui?.clear();
entities?.clear();
} }
void _sendSubscribe() { void _sendSubscribe() {

View File

@ -367,7 +367,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
), ),
) )
); );
if (widget.homeAssistant != null && widget.homeAssistant.panels.isNotEmpty) { if (widget.homeAssistant.panels.isNotEmpty) {
widget.homeAssistant.panels.forEach((Panel panel) { widget.homeAssistant.panels.forEach((Panel panel) {
if (!panel.isHidden) { if (!panel.isHidden) {
menuItems.add( menuItems.add(
@ -379,16 +379,18 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
); );
} }
}); });
menuItems.addAll([ }
if (widget.homeAssistant.isSettingsLoaded) {
menuItems.add(
new ListTile( new ListTile(
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant")), leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant")),
title: Text("Open Web UI"), title: Text("Open Web UI"),
onTap: () => HAUtils.launchURL(widget.homeAssistant.httpWebHost), onTap: () => HAUtils.launchURL(widget.homeAssistant.httpWebHost),
), )
Divider() );
]);
} }
menuItems.addAll([ menuItems.addAll([
Divider(),
ListTile( ListTile(
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:login-variant")), leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:login-variant")),
title: Text("Connection settings"), title: Text("Connection settings"),
@ -396,16 +398,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
Navigator.of(context).pop(); Navigator.of(context).pop();
Navigator.of(context).pushNamed('/connection-settings', arguments: {"homeAssistant", widget.homeAssistant}); Navigator.of(context).pushNamed('/connection-settings', arguments: {"homeAssistant", widget.homeAssistant});
}, },
), )
ListTile( ]);
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:logout-variant")), menuItems.addAll([
title: Text("Logout"),
onTap: () {
widget.homeAssistant.logout().then((_) {
widget.homeAssistant.disconnect().then((__) => _refreshData());
});
},
),
Divider(), Divider(),
new ListTile( new ListTile(
leading: Icon(Icons.insert_drive_file), leading: Icon(Icons.insert_drive_file),
@ -603,6 +598,24 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
Widget _buildScaffoldBody(bool empty) { Widget _buildScaffoldBody(bool empty) {
List<PopupMenuItem<String>> popupMenuItems = [];
if (widget.homeAssistant.isAuthenticated) {
popupMenuItems.addAll([
PopupMenuItem<String>(
child: new Text("Reload"),
value: "reload",
),
PopupMenuItem<String>(
child: new Text("Logout"),
value: "logout",
)]);
} else {
popupMenuItems.addAll([
PopupMenuItem<String>(
child: new Text("Connect"),
value: "reload",
)]);
}
return NestedScrollView( return NestedScrollView(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[ return <Widget>[
@ -610,7 +623,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
floating: true, floating: true,
pinned: true, pinned: true,
primary: true, primary: true,
title: Text(widget.homeAssistant != null ? widget.homeAssistant.locationName : ""), title: Text(widget.homeAssistant.locationName ?? ""),
actions: <Widget>[ actions: <Widget>[
IconButton( IconButton(
icon: Icon(MaterialDesignIcons.getIconDataFromIconName( icon: Icon(MaterialDesignIcons.getIconDataFromIconName(
@ -619,13 +632,18 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
showMenu( showMenu(
position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0), position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0),
context: context, context: context,
items: [PopupMenuItem<String>( items: popupMenuItems
child: new Text("Reload"),
value: "reload",
)]
).then((String val) { ).then((String val) {
if (val == "reload") { if (val == "reload") {
_refreshData(); _refreshData();
} else if (val == "logout") {
widget.homeAssistant.disconnect().then((_) {
widget.homeAssistant.logout().then((_) {
setState(() {
_refreshData();
});
});
});
} }
}); });
} }
@ -652,9 +670,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Icon( Icon(
MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant"), MaterialDesignIcons.getIconDataFromIconName("mdi:border-none-variant"),
size: 100.0, size: 100.0,
color: Colors.blue, color: Colors.black26,
), ),
] ]
), ),
@ -717,7 +735,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
} }
} }
// This method is rerun every time setState is called. // This method is rerun every time setState is called.
if (widget.homeAssistant.ui == null || widget.homeAssistant.ui.views == null) { if (widget.homeAssistant.isNoViews) {
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
primary: false, primary: false,

View File

@ -4,6 +4,8 @@ class HomeAssistantUI {
List<HAView> views; List<HAView> views;
String title; String title;
bool get isEmpty => views == null || views.isEmpty;
HomeAssistantUI() { HomeAssistantUI() {
views = []; views = [];
} }
@ -25,4 +27,8 @@ class HomeAssistantUI {
return result; return result;
} }
void clear() {
views.clear();
}
} }