diff --git a/assets/html/cameraLiveView.html b/assets/html/cameraLiveView.html
new file mode 100644
index 0000000..a6d9258
--- /dev/null
+++ b/assets/html/cameraLiveView.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
\ 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 8acc605..2e4a35d 100644
--- a/lib/entities/camera/widgets/camera_stream_view.dart
+++ b/lib/entities/camera/widgets/camera_stream_view.dart
@@ -14,8 +14,6 @@ class _CameraStreamViewState extends State {
CameraEntity _entity;
String _streamUrl = "";
- VideoPlayerController _videoPlayerController;
- Timer _monitorTimer;
bool _isLoaded = false;
double _aspectRatio = 1.33;
String _webViewHtml;
@@ -41,11 +39,15 @@ class _CameraStreamViewState extends State {
if (_entity.supportStream) {
HomeAssistant().getCameraStream(_entity.entityId)
.then((data) {
- if (_videoPlayerController != null) {
- _videoPlayerController.dispose().then((_) => createPlayer(data));
- } else {
- createPlayer(data);
- }
+ _jsMessageChannelName = 'HA_${_entity.entityId.replaceAll('.', '_')}';
+ rootBundle.loadString('assets/html/cameraLiveView.html').then((file) {
+ _webViewHtml = Uri.dataFromString(
+ file.replaceFirst('{{stream_url}}', '${ConnectionManager().httpWebHost}${data["url"]}').replaceFirst('{{message_channel}}', _jsMessageChannelName),
+ mimeType: 'text/html',
+ encoding: Encoding.getByName('utf-8')
+ ).toString();
+ _loading.complete();
+ });
})
.catchError((e) {
_loading.completeError(e);
@@ -67,40 +69,6 @@ class _CameraStreamViewState extends State {
return _loading.future;
}
- void createPlayer(data) {
- _videoPlayerController = VideoPlayerController.network("${ConnectionManager().httpWebHost}${data["url"]}");
- _videoPlayerController.initialize().then((_) {
- setState((){
- _aspectRatio = _videoPlayerController.value.aspectRatio;
- });
- _loading.complete();
- autoPlay();
- startMonitor();
- }).catchError((e) {
- _loading.completeError(e);
- Logger.e("[Camera Player] Error player init. Retrying");
- _loadResources();
- });
- }
-
- void autoPlay() {
- if (!_videoPlayerController.value.isPlaying) {
- _videoPlayerController.play();
- }
- }
-
- void startMonitor() {
- _monitorTimer?.cancel();
- _monitorTimer = Timer.periodic(Duration(milliseconds: 500), (timer) {
- if (_videoPlayerController.value.hasError) {
- timer.cancel();
- setState(() {
- _isLoaded = false;
- });
- }
- });
- }
-
Widget _buildScreen() {
Widget screenWidget;
if (!_isLoaded) {
@@ -109,16 +77,6 @@ class _CameraStreamViewState extends State {
fit: BoxFit.contain,
)
);
- } else if (_entity.supportStream) {
- if (_videoPlayerController.value.initialized) {
- screenWidget = VideoPlayer(_videoPlayerController);
- } else {
- screenWidget = Center(
- child: EntityPicture(
- fit: BoxFit.contain,
- )
- );
- }
} else {
screenWidget = WebView(
initialUrl: _webViewHtml,
@@ -130,6 +88,7 @@ class _CameraStreamViewState extends State {
JavascriptChannel(
name: _jsMessageChannelName,
onMessageReceived: ((message) {
+ Logger.d('[Camera Player] Message from page: $message');
setState((){
_aspectRatio = double.tryParse(message.message) ?? 1.33;
});
@@ -145,28 +104,6 @@ class _CameraStreamViewState extends State {
}
Widget _buildControls() {
- Widget playControl;
- if (_entity.supportStream) {
- playControl = Center(
- child: IconButton(
- icon: Icon((_videoPlayerController != null && _videoPlayerController.value.isPlaying) ? Icons.pause_circle_outline : Icons.play_circle_outline),
- iconSize: 60,
- color: Theme.of(context).accentColor,
- onPressed: (_videoPlayerController == null || _videoPlayerController.value.hasError || !_isLoaded) ? null :
- () {
- setState(() {
- if (_videoPlayerController != null && _videoPlayerController.value.isPlaying) {
- _videoPlayerController.pause();
- } else {
- _videoPlayerController.play();
- }
- });
- },
- ),
- );
- } else {
- playControl = Container();
- }
return Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
@@ -183,14 +120,14 @@ class _CameraStreamViewState extends State {
} : null,
),
Expanded(
- child: playControl,
+ child: Container(),
),
IconButton(
icon: Icon(Icons.fullscreen),
iconSize: 40,
color: Theme.of(context).accentColor,
onPressed: _isLoaded ? () {
- _videoPlayerController?.pause();
+ //_videoPlayerController?.pause();
eventBus.fire(ShowEntityPageEvent());
Navigator.of(context).push(
MaterialPageRoute(
@@ -239,8 +176,6 @@ class _CameraStreamViewState extends State {
@override
void dispose() {
- _monitorTimer?.cancel();
- _videoPlayerController?.dispose();
super.dispose();
}
}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index edbb07e..bd86043 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -33,7 +33,6 @@ import 'package:battery/battery.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart' as standaloneWebview;
import 'package:webview_flutter/webview_flutter.dart';
-import 'package:video_player/video_player.dart';
import 'package:syncfusion_flutter_core/core.dart';
import 'package:syncfusion_flutter_gauges/gauges.dart';
diff --git a/pubspec.yaml b/pubspec.yaml
index c937231..f4d8031 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -32,7 +32,6 @@ dependencies:
workmanager: ^0.2.2
battery: ^0.3.1+7
firebase_crashlytics: ^0.1.3+3
- video_player: ^0.10.7
syncfusion_flutter_core: ^18.1.43
syncfusion_flutter_gauges: ^18.1.43
@@ -55,6 +54,7 @@ flutter:
- images/hassio-192x192.png
- assets/js/externalAuth.js
- assets/html/cameraView.html
+ - assets/html/cameraLiveView.html
fonts:
- family: "Material Design Icons"