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 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;
HomeAssistant() {
@ -106,14 +109,14 @@ class HomeAssistant {
return _fetchCompleter.future;
}
disconnect() async {
Future disconnect() async {
Logger.d( "Socket disconnecting...");
await _socketSubscription?.cancel();
await _hassioChannel?.sink?.close()?.timeout(Duration(seconds: 3),
onTimeout: () => Logger.d( "Socket sink closed")
await _hassioChannel?.sink?.close()?.timeout(Duration(seconds: 4),
onTimeout: () => Logger.d( "Socket sink close timeout")
);
_hassioChannel = null;
Logger.d( "..Disconnected");
}
Future _connection() {
@ -263,10 +266,12 @@ class HomeAssistant {
}
Future logout() async {
Logger.d("Logging out...");
_token = null;
_tempToken = null;
//TODO proper clear
await SharedPreferences.getInstance().then((prefs) => prefs.remove("hassio-token"));
ui?.clear();
entities?.clear();
}
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) {
if (!panel.isHidden) {
menuItems.add(
@ -379,16 +379,18 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
);
}
});
menuItems.addAll([
}
if (widget.homeAssistant.isSettingsLoaded) {
menuItems.add(
new ListTile(
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant")),
title: Text("Open Web UI"),
onTap: () => HAUtils.launchURL(widget.homeAssistant.httpWebHost),
),
Divider()
]);
)
);
}
menuItems.addAll([
Divider(),
ListTile(
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:login-variant")),
title: Text("Connection settings"),
@ -396,16 +398,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
Navigator.of(context).pop();
Navigator.of(context).pushNamed('/connection-settings', arguments: {"homeAssistant", widget.homeAssistant});
},
),
ListTile(
leading: Icon(MaterialDesignIcons.getIconDataFromIconName("mdi:logout-variant")),
title: Text("Logout"),
onTap: () {
widget.homeAssistant.logout().then((_) {
widget.homeAssistant.disconnect().then((__) => _refreshData());
});
},
),
)
]);
menuItems.addAll([
Divider(),
new ListTile(
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>();
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(
headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
return <Widget>[
@ -610,7 +623,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
floating: true,
pinned: true,
primary: true,
title: Text(widget.homeAssistant != null ? widget.homeAssistant.locationName : ""),
title: Text(widget.homeAssistant.locationName ?? ""),
actions: <Widget>[
IconButton(
icon: Icon(MaterialDesignIcons.getIconDataFromIconName(
@ -619,13 +632,18 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
showMenu(
position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0),
context: context,
items: [PopupMenuItem<String>(
child: new Text("Reload"),
value: "reload",
)]
items: popupMenuItems
).then((String val) {
if (val == "reload") {
_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,
children: [
Icon(
MaterialDesignIcons.getIconDataFromIconName("mdi:home-assistant"),
MaterialDesignIcons.getIconDataFromIconName("mdi:border-none-variant"),
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.
if (widget.homeAssistant.ui == null || widget.homeAssistant.ui.views == null) {
if (widget.homeAssistant.isNoViews) {
return Scaffold(
key: _scaffoldKey,
primary: false,

View File

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