Embedded webview

This commit is contained in:
Yegor Vialov 2020-02-12 21:13:49 +00:00
parent ed732e9b77
commit 6695756727
4 changed files with 61 additions and 11 deletions

View File

@ -1,8 +1,10 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:async'; import 'dart:async';
import 'dart:math'; import 'dart:math';
import 'package:flutter/foundation.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:web_socket_channel/io.dart'; import 'package:web_socket_channel/io.dart';
import 'package:event_bus/event_bus.dart'; import 'package:event_bus/event_bus.dart';
@ -29,6 +31,7 @@ import 'package:geolocator/geolocator.dart';
import 'package:battery/battery.dart'; import 'package:battery/battery.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart'; import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'utils/logger.dart'; import 'utils/logger.dart';

View File

@ -9,7 +9,7 @@ class StartupUserMessagesManager {
return _instance; return _instance;
} }
StartupUserMessagesManager._internal() {} StartupUserMessagesManager._internal();
bool _supportAppDevelopmentMessageShown; bool _supportAppDevelopmentMessageShown;
bool _whatsNewMessageShown; bool _whatsNewMessageShown;

View File

@ -119,9 +119,9 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
_fetchData() async { _fetchData() async {
if (ConnectionManager().useWebView) { 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) { if (viewState.type == WebViewState.startLoad) {
Logger.d("[WebView] Injecting external auth JS"); Logger.d("[WebView] Injecting external auth JS");
rootBundle.loadString('assets/js/externalAuth.js').then((js){ rootBundle.loadString('assets/js/externalAuth.js').then((js){
@ -135,7 +135,7 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
flutterWebViewPlugin.hide(); flutterWebViewPlugin.hide();
Navigator.pushNamed(context, "/connection-settings"); Navigator.pushNamed(context, "/connection-settings");
} }
}); });*/
} }
await HomeAssistant().fetchData().then((_) { await HomeAssistant().fetchData().then((_) {
_hideBottomBar(); _hideBottomBar();
@ -806,6 +806,14 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
} }
TabController _viewsTabController; 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -867,11 +875,49 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
) )
); );
} else if (ConnectionManager().settingsLoaded && ConnectionManager().useWebView) { } else if (ConnectionManager().settingsLoaded && ConnectionManager().useWebView) {
return WebviewScaffold( return WillPopScope(
url: ConnectionManager().httpWebHostWithExtAuth, child: Scaffold(
primary: false, primary: true,
debuggingEnabled: true, appBar: EmptyAppBar(),
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: <Factory<OneSequenceGestureRecognizer>>[
new Factory<OneSequenceGestureRecognizer>(
() => 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 { } else {
if (HomeAssistant().isNoViews) { if (HomeAssistant().isNoViews) {
@ -907,8 +953,8 @@ class _MainPageState extends State<MainPage> with WidgetsBindingObserver, Ticker
@override @override
void dispose() { void dispose() {
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
final flutterWebviewPlugin = new FlutterWebviewPlugin(); //final flutterWebviewPlugin = new FlutterWebviewPlugin();
flutterWebviewPlugin.dispose(); //flutterWebviewPlugin.dispose();
_viewsTabController?.dispose(); _viewsTabController?.dispose();
_stateSubscription?.cancel(); _stateSubscription?.cancel();
_settingsSubscription?.cancel(); _settingsSubscription?.cancel();

View File

@ -22,6 +22,7 @@ dependencies:
in_app_purchase: ^0.3.0+3 in_app_purchase: ^0.3.0+3
flutter_custom_tabs: ^0.6.0 flutter_custom_tabs: ^0.6.0
flutter_webview_plugin: ^0.3.10+1 flutter_webview_plugin: ^0.3.10+1
webview_flutter: ^0.3.19+7
firebase_messaging: ^6.0.9 firebase_messaging: ^6.0.9
flutter_secure_storage: ^3.3.1+1 flutter_secure_storage: ^3.3.1+1
device_info: ^0.4.1+4 device_info: ^0.4.1+4