diff --git a/lib/main.dart b/lib/main.dart index ee726e1..8472bfe 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,8 +1,10 @@ import 'dart:convert'; import 'dart:async'; import 'dart:math'; +import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/gestures.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:web_socket_channel/io.dart'; import 'package:event_bus/event_bus.dart'; @@ -29,6 +31,7 @@ import 'package:geolocator/geolocator.dart'; import 'package:battery/battery.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:flutter_webview_plugin/flutter_webview_plugin.dart'; +import 'package:webview_flutter/webview_flutter.dart'; import 'utils/logger.dart'; diff --git a/lib/managers/startup_user_messages_manager.class.dart b/lib/managers/startup_user_messages_manager.class.dart index 8830e84..241278b 100644 --- a/lib/managers/startup_user_messages_manager.class.dart +++ b/lib/managers/startup_user_messages_manager.class.dart @@ -9,7 +9,7 @@ class StartupUserMessagesManager { return _instance; } - StartupUserMessagesManager._internal() {} + StartupUserMessagesManager._internal(); bool _supportAppDevelopmentMessageShown; bool _whatsNewMessageShown; diff --git a/lib/pages/main/main.page.dart b/lib/pages/main/main.page.dart index 8039391..e7faed0 100644 --- a/lib/pages/main/main.page.dart +++ b/lib/pages/main/main.page.dart @@ -119,9 +119,9 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker _fetchData() async { if (ConnectionManager().useWebView) { - final flutterWebViewPlugin = new FlutterWebviewPlugin(); + //final flutterWebViewPlugin = new FlutterWebviewPlugin(); - flutterWebViewPlugin.onStateChanged.listen((viewState) async { + /*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){ @@ -135,7 +135,7 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker flutterWebViewPlugin.hide(); Navigator.pushNamed(context, "/connection-settings"); } - }); + });*/ } await HomeAssistant().fetchData().then((_) { _hideBottomBar(); @@ -806,6 +806,14 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker } TabController _viewsTabController; + WebViewController _mainWebViewController; + + _loadJSInterface() { + Logger.d("[MainWebView] Injecting JS interface"); + rootBundle.loadString('assets/js/externalAuth.js').then((js){ + _mainWebViewController.evaluateJavascript(js.replaceFirst("[token]", ConnectionManager()._token)); + }); + } @override Widget build(BuildContext context) { @@ -867,11 +875,49 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker ) ); } else if (ConnectionManager().settingsLoaded && ConnectionManager().useWebView) { - return WebviewScaffold( - url: ConnectionManager().httpWebHostWithExtAuth, - primary: false, - debuggingEnabled: true, - appBar: EmptyAppBar() + return WillPopScope( + child: Scaffold( + primary: true, + appBar: EmptyAppBar(), + body: WebView( + initialUrl: ConnectionManager().httpWebHostWithExtAuth, + debuggingEnabled: Logger.isInDebugMode, + javascriptMode: JavascriptMode.unrestricted, + onWebViewCreated: (webviewController) { + _mainWebViewController = webviewController; + }, + onPageStarted: (url) { + Logger.d("[MainWebView] Page started: $url"); + if (url.contains(ConnectionManager()._domain)) { + _loadJSInterface(); + } else if (url.contains("htcmd://show-settings")) { + Navigator.of(context).pushNamed("/connection-settings").then((_) { + _mainWebViewController.goBack(); + }); + } + }, + gestureNavigationEnabled: true, + gestureRecognizers: >[ + new Factory( + () => new EagerGestureRecognizer(), + ), + ].toSet(), + ) + ), + onWillPop: () { + Completer completer = Completer(); + if (_mainWebViewController != null) { + _mainWebViewController.canGoBack().then((canGoBack) { + if (canGoBack) { + _mainWebViewController.goBack(); + } + completer.complete(!canGoBack); + }); + } else { + completer.complete(true); + } + return completer.future; + }, ); } else { if (HomeAssistant().isNoViews) { @@ -907,8 +953,8 @@ class _MainPageState extends State with WidgetsBindingObserver, Ticker @override void dispose() { WidgetsBinding.instance.removeObserver(this); - final flutterWebviewPlugin = new FlutterWebviewPlugin(); - flutterWebviewPlugin.dispose(); + //final flutterWebviewPlugin = new FlutterWebviewPlugin(); + //flutterWebviewPlugin.dispose(); _viewsTabController?.dispose(); _stateSubscription?.cancel(); _settingsSubscription?.cancel(); diff --git a/pubspec.yaml b/pubspec.yaml index 6b5f1b8..e6e0c64 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -22,6 +22,7 @@ dependencies: in_app_purchase: ^0.3.0+3 flutter_custom_tabs: ^0.6.0 flutter_webview_plugin: ^0.3.10+1 + webview_flutter: ^0.3.19+7 firebase_messaging: ^6.0.9 flutter_secure_storage: ^3.3.1+1 device_info: ^0.4.1+4