Embedded webview
This commit is contained in:
parent
ed732e9b77
commit
6695756727
@ -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';
|
||||
|
||||
|
@ -9,7 +9,7 @@ class StartupUserMessagesManager {
|
||||
return _instance;
|
||||
}
|
||||
|
||||
StartupUserMessagesManager._internal() {}
|
||||
StartupUserMessagesManager._internal();
|
||||
|
||||
bool _supportAppDevelopmentMessageShown;
|
||||
bool _whatsNewMessageShown;
|
||||
|
@ -119,9 +119,9 @@ class _MainPageState extends State<MainPage> 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<MainPage> with WidgetsBindingObserver, Ticker
|
||||
flutterWebViewPlugin.hide();
|
||||
Navigator.pushNamed(context, "/connection-settings");
|
||||
}
|
||||
});
|
||||
});*/
|
||||
}
|
||||
await HomeAssistant().fetchData().then((_) {
|
||||
_hideBottomBar();
|
||||
@ -806,6 +806,14 @@ class _MainPageState extends State<MainPage> 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<MainPage> 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: <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 {
|
||||
if (HomeAssistant().isNoViews) {
|
||||
@ -907,8 +953,8 @@ class _MainPageState extends State<MainPage> 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();
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user