Embedded webview
This commit is contained in:
parent
ed732e9b77
commit
6695756727
@ -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';
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ class StartupUserMessagesManager {
|
|||||||
return _instance;
|
return _instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
StartupUserMessagesManager._internal() {}
|
StartupUserMessagesManager._internal();
|
||||||
|
|
||||||
bool _supportAppDevelopmentMessageShown;
|
bool _supportAppDevelopmentMessageShown;
|
||||||
bool _whatsNewMessageShown;
|
bool _whatsNewMessageShown;
|
||||||
|
@ -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();
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user