From 3dd7069292b20a9cd9f495e12793761f2f9d11ed Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Sun, 15 Sep 2019 00:49:49 +0300 Subject: [PATCH] Resolves #450 Quick access to active media players --- lib/entity_collection.class.dart | 14 +++--- lib/pages/main.page.dart | 75 ++++++++++++++++++++++++++++---- lib/pages/play_media.page.dart | 2 +- 3 files changed, 73 insertions(+), 18 deletions(-) diff --git a/lib/entity_collection.class.dart b/lib/entity_collection.class.dart index 2ca6a56..034b991 100644 --- a/lib/entity_collection.class.dart +++ b/lib/entity_collection.class.dart @@ -149,15 +149,11 @@ class EntityCollection { return _allEntities[entityId] != null; } - List getByDomains(List domains) { - List result = []; - _allEntities.forEach((id, entity) { - if (domains.contains(entity.domain)) { - Logger.d("getByDomain: ${entity.isHidden}"); - result.add(entity); - } - }); - return result; + List getByDomains({List domains, List stateFiler}) { + return _allEntities.values.where((entity) { + return domains.contains(entity.domain) && + ((stateFiler != null && stateFiler.contains(entity.state)) || stateFiler == null); + }).toList(); } List filterEntitiesForDefaultView() { diff --git a/lib/pages/main.page.dart b/lib/pages/main.page.dart index e255602..05e3aed 100644 --- a/lib/pages/main.page.dart +++ b/lib/pages/main.page.dart @@ -318,7 +318,7 @@ class _MainPageState extends ReceiveShareState with WidgetsBindingObse ); } - //TODO remove this shit + //TODO remove this shit.... maybe void _callService(String domain, String service, String entityId, Map additionalParams) { _showInfoBottomBar( message: "Calling $domain.$service", @@ -643,20 +643,68 @@ class _MainPageState extends ReceiveShareState with WidgetsBindingObse final GlobalKey _scaffoldKey = new GlobalKey(); Widget _buildScaffoldBody(bool empty) { - List> popupMenuItems = []; + List> serviceMenuItems = []; + List> mediaMenuItems = []; - popupMenuItems.add(PopupMenuItem( + serviceMenuItems.add(PopupMenuItem( child: new Text("Reload"), value: "reload", )); if (ConnectionManager().isAuthenticated) { _showLoginButton = false; - popupMenuItems.add( + serviceMenuItems.add( PopupMenuItem( child: new Text("Logout"), value: "logout", )); } + Widget mediaMenuIcon; + mediaMenuItems.add(PopupMenuItem( + child: new Text("Play media..."), + value: "play_media", + )); + int playersCount = 0; + if (!empty && !HomeAssistant().entities.isEmpty) { + List activePlayers = HomeAssistant().entities.getByDomains(domains: ["media_player"], stateFiler: [EntityState.paused, EntityState.playing]); + playersCount = activePlayers.length; + mediaMenuItems.addAll( + activePlayers.map((entity) => PopupMenuItem( + child: Text( + "${entity.displayName}", + style: TextStyle( + color: EntityColor.stateColor(entity.state) + ), + ), + value: "${entity.entityId}", + )).toList() + ); + } + if (playersCount > 0) { + mediaMenuIcon = Stack( + children: [ + Icon(MaterialDesignIcons.getIconDataFromIconName( + "mdi:television"), color: Colors.white,), + Positioned( + bottom: 0, + right: 0, + child: Container( + height: 14, + width: 14, + decoration: new BoxDecoration( + color: Colors.amber, + shape: BoxShape.circle, + ), + child: Center( + child: Text("$playersCount", style: TextStyle(fontSize: 10)), + ), + ), + ) + ], + ); + } else { + mediaMenuIcon = Icon(MaterialDesignIcons.getIconDataFromIconName( + "mdi:television"), color: Colors.white,); + } Widget mainScrollBody; if (empty) { if (_showLoginButton) { @@ -717,9 +765,20 @@ class _MainPageState extends ReceiveShareState with WidgetsBindingObse title: Text(HomeAssistant().locationName ?? ""), actions: [ IconButton( - icon: Icon(MaterialDesignIcons.getIconDataFromIconName( - "mdi:television"), color: Colors.white,), - onPressed: () => Navigator.pushNamed(context, "/play-media", arguments: {"url": ""}) + icon: mediaMenuIcon, + onPressed: () { + showMenu( + position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0), + context: context, + items: mediaMenuItems + ).then((String val) { + if (val == "play_media") { + Navigator.pushNamed(context, "/play-media", arguments: {"url": ""}); + } else { + _showEntityPage(val); + } + }); + } ), IconButton( icon: Icon(MaterialDesignIcons.getIconDataFromIconName( @@ -728,7 +787,7 @@ class _MainPageState extends ReceiveShareState with WidgetsBindingObse showMenu( position: RelativeRect.fromLTRB(MediaQuery.of(context).size.width, 70.0, 0.0, 0.0), context: context, - items: popupMenuItems + items: serviceMenuItems ).then((String val) { if (val == "reload") { _quickLoad(); diff --git a/lib/pages/play_media.page.dart b/lib/pages/play_media.page.dart index 16104ca..76f2173 100644 --- a/lib/pages/play_media.page.dart +++ b/lib/pages/play_media.page.dart @@ -49,7 +49,7 @@ class _PlayMediaPageState extends State { } else { _isMediaExtractorExist = HomeAssistant().services.containsKey("media_extractor"); //_useMediaExtractor = _isMediaExtractorExist; - _players = HomeAssistant().entities.getByDomains(["media_player"]); + _players = HomeAssistant().entities.getByDomains(domains: ["media_player"]); setState(() { if (_players.isNotEmpty) { _loaded = true;