diff --git a/assets/js/externalAuth.js b/assets/js/externalAuth.js new file mode 100644 index 0000000..36818ad --- /dev/null +++ b/assets/js/externalAuth.js @@ -0,0 +1,16 @@ +window.externalApp = {}; +window.externalApp.getExternalAuth = function(options) { + console.log("Starting external auth"); + var options = JSON.parse(options); + if (options && options.callback) { + var responseData = { + access_token: "[token]", + expires_in: 1800 + }; + console.log("Waiting for callback to be added"); + setTimeout(function(){ + console.log("Calling a callback"); + window[options.callback](true, responseData); + }, 500); + } +}; \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index c114f67..b81523c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -134,10 +134,10 @@ void main() async { }; runZoned(() { - AndroidAlarmManager.initialize().then((_) { + //AndroidAlarmManager.initialize().then((_) { runApp(new HAClientApp()); - print("Running MAIN isolate ${Isolate.current.hashCode}"); - }); + // print("Running MAIN isolate ${Isolate.current.hashCode}"); + //}); }, onError: (error, stack) { Logger.e("$error"); @@ -181,6 +181,16 @@ class HAClientApp extends StatelessWidget { ) ], ), + ), + "/webview": (context) => WebviewScaffold( + url: "${(ModalRoute.of(context).settings.arguments as Map)['url']}", + appBar: new AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back), + onPressed: () => Navigator.of(context).pop() + ), + title: new Text("${(ModalRoute.of(context).settings.arguments as Map)['title']}"), + ), ) }, ); @@ -250,8 +260,6 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: onSelectNotification); - - _settingsSubscription = eventBus.on().listen((event) { Logger.d("Settings change event: reconnect=${event.reconnect}"); if (event.reconnect) { @@ -495,6 +503,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker ); } + //TODO remove this shit void _callService(String domain, String service, String entityId, Map additionalParams) { _showInfoBottomBar( message: "Calling $domain.$service", diff --git a/lib/ui_class/panel_class.dart b/lib/ui_class/panel_class.dart index b23d34b..e91d373 100644 --- a/lib/ui_class/panel_class.dart +++ b/lib/ui_class/panel_class.dart @@ -22,23 +22,35 @@ class Panel { if (icon == null || !icon.startsWith("mdi:")) { icon = Panel.iconsByComponent[type]; } - isHidden = (type != "iframe" && type != "config"); + Logger.d("New panel '$title'. type=$type, icon=$icon, urlPath=$urlPath"); + isHidden = (type == 'lovelace' || type == 'kiosk' || type == 'states'); } void handleOpen(BuildContext context) { - if (type == "iframe") { - Logger.d("Launching custom tab with ${config["url"]}"); - HAUtils.launchURLInCustomTab(context: context, url: config["url"]); - } else if (type == "config") { + if (type == "config") { Navigator.of(context).push( MaterialPageRoute( builder: (context) => PanelPage(title: "$title", panel: this), ) ); } else { - String url = "${ConnectionManager().httpWebHost}/$urlPath"; - Logger.d("Launching custom tab with $url"); - HAUtils.launchURLInCustomTab(context: context, url: url); + String url = "${ConnectionManager().httpWebHost}/$urlPath?external_auth=1"; + final flutterWebViewPlugin = new FlutterWebviewPlugin(); + flutterWebViewPlugin.onStateChanged.listen((viewState) async { + if (viewState.type == WebViewState.startLoad) { + Logger.d("[WebView] Injecting external auth JS"); + rootBundle.loadString('assets/js/externalAuth.js').then((js){ + flutterWebViewPlugin.evalJavascript(js.replaceFirst("[token]", ConnectionManager()._token)); + }); + } + }); + Navigator.of(context).pushNamed( + "/webview", + arguments: { + "url": "$url", + "title": "${this.title}" + } + ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 26a683d..4093f62 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -50,9 +50,9 @@ flutter: # the material Icons class. uses-material-design: true - # To add assets to your application, add an assets section, like this: assets: - images/hassio-192x192.png + - assets/js/externalAuth.js # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.io/assets-and-images/#resolution-aware.