diff --git a/assets/html/cameraView.html b/assets/html/cameraView.html new file mode 100644 index 0000000..4bfd8bc --- /dev/null +++ b/assets/html/cameraView.html @@ -0,0 +1,28 @@ + + + + + + + + + \ No newline at end of file diff --git a/lib/entities/camera/widgets/camera_stream_view.dart b/lib/entities/camera/widgets/camera_stream_view.dart index b763bb9..1924d5d 100644 --- a/lib/entities/camera/widgets/camera_stream_view.dart +++ b/lib/entities/camera/widgets/camera_stream_view.dart @@ -17,24 +17,42 @@ class _CameraStreamViewState extends State { Timer monitorTimer; bool started = false; double aspectRatio = 1.33; + String htmlView; + String messageChannelName = 'unknown'; @override void initState() { super.initState(); } - void loadStreamUrl() { - Logger.d("[Camera Player] Loading stream url"); - HomeAssistant().getCameraStream(_entity.entityId) - .then((data) { - Logger.d("[Camera Player] Stream url: ${ConnectionManager().httpWebHost}${data["url"]}"); - if (videoPlayerController != null) { - videoPlayerController.dispose().then((_) => createPlayer(data)); - } else { - createPlayer(data); - } - }) - .catchError((e) => Logger.e("[Camera Player] $e")); + void loadResources() { + Logger.d("[Camera Player] Loading resources"); + if (_entity.supportStream) { + HomeAssistant().getCameraStream(_entity.entityId) + .then((data) { + Logger.d("[Camera Player] Stream url: ${ConnectionManager().httpWebHost}${data["url"]}"); + if (videoPlayerController != null) { + videoPlayerController.dispose().then((_) => createPlayer(data)); + } else { + createPlayer(data); + } + }) + .catchError((e) => Logger.e("[Camera Player] $e")); + } else { + streamUrl = '${ConnectionManager().httpWebHost}/api/camera_proxy_stream/${_entity + .entityId}?token=${_entity.attributes['access_token']}'; + messageChannelName = 'HA_${_entity.entityId.replaceAll('.', '_')}'; + rootBundle.loadString('assets/html/cameraView.html').then((file) { + htmlView = Uri.dataFromString( + file.replaceFirst('{{stream_url}}', streamUrl).replaceFirst('{{message_channel}}', messageChannelName), + mimeType: 'text/html', + encoding: Encoding.getByName('utf-8') + ).toString(); + setState((){ + started = true; + }); + }); + } } void createPlayer(data) { @@ -48,7 +66,7 @@ class _CameraStreamViewState extends State { startMonitor(); }).catchError((e) { Logger.e("[Camera Player] Error player init. Retrying"); - loadStreamUrl(); + loadResources(); }); } @@ -80,12 +98,12 @@ class _CameraStreamViewState extends State { @override Widget build(BuildContext context) { - _entity = EntityModel + if (!started) { + _entity = EntityModel .of(context) .entityWrapper .entity; - if (_entity.supportStream && !started) { - loadStreamUrl(); + loadResources(); return buildLoading(); } else if (_entity.supportStream) { if (videoPlayerController.value.initialized) { @@ -97,19 +115,17 @@ class _CameraStreamViewState extends State { return buildLoading(); } } else { - streamUrl = '${ConnectionManager().httpWebHost}/api/camera_proxy_stream/${_entity - .entityId}?token=${_entity.attributes['access_token']}'; return AspectRatio( aspectRatio: aspectRatio, child: WebView( - initialUrl: streamUrl, + initialUrl: htmlView, initialMediaPlaybackPolicy: AutoMediaPlaybackPolicy.always_allow, debuggingEnabled: Logger.isInDebugMode, gestureNavigationEnabled: false, javascriptMode: JavascriptMode.unrestricted, javascriptChannels: { JavascriptChannel( - name: 'HA_${_entity.entityId.replaceAll('.', '_')}', + name: messageChannelName, onMessageReceived: ((message) { setState((){ aspectRatio = double.tryParse(message.message) ?? 1.33; @@ -121,9 +137,9 @@ class _CameraStreamViewState extends State { webViewController = controller; }, onPageStarted: (url) { - rootBundle.loadString('assets/js/cameraImgViewHelper.js').then((js){ + /*rootBundle.loadString('assets/js/cameraImgViewHelper.js').then((js){ webViewController.evaluateJavascript(js.replaceFirst('entity_id_placeholder', _entity.entityId.replaceAll('.', '_'))); - }); + });*/ }, ), ); diff --git a/pubspec.yaml b/pubspec.yaml index ec7c6a7..bafdd7e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ version: 0.8.0+880 environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: ">=2.2.0 <3.0.0" dependencies: flutter: @@ -52,6 +52,7 @@ flutter: - images/hassio-192x192.png - assets/js/externalAuth.js - assets/js/cameraImgViewHelper.js + - assets/html/cameraView.html fonts: - family: "Material Design Icons"