From 76057e8797f299d83056aeaceeea097317b8cc41 Mon Sep 17 00:00:00 2001 From: estevez-dev Date: Wed, 20 Feb 2019 17:55:56 +0200 Subject: [PATCH] WIP #302 simple SVG support --- .../common/camera_stream_view.dart | 42 +++++++++++++------ lib/main.dart | 2 + pubspec.lock | 34 +++++++++++++-- pubspec.yaml | 2 + 4 files changed, 65 insertions(+), 15 deletions(-) diff --git a/lib/entity_widgets/common/camera_stream_view.dart b/lib/entity_widgets/common/camera_stream_view.dart index 5065a55..eba1604 100644 --- a/lib/entity_widgets/common/camera_stream_view.dart +++ b/lib/entity_widgets/common/camera_stream_view.dart @@ -20,10 +20,10 @@ class _CameraStreamViewState extends State { http.Client client; http.StreamedResponse response; List binaryImage = []; - String cameraState = "Connecting..."; bool timeToStop = false; Completer streamCompleter; bool started = false; + bool useSVG = false; void _connect() async { started = true; @@ -31,11 +31,8 @@ class _CameraStreamViewState extends State { String streamUrl = '$homeAssistantWebHost/api/camera_proxy_stream/${_entity.entityId}?token=${_entity.attributes['access_token']}'; client = new http.Client(); // create a client to make api calls http.Request request = new http.Request("GET", Uri.parse(streamUrl)); // create get request - Logger.d("[Sending] ==> ${streamUrl}"); + Logger.d("[Sending] ==> $streamUrl"); response = await client.send(request); - setState(() { - cameraState = "Starting..."; - }); Logger.d("[Received] <== ${response.headers}"); String frameBoundary = response.headers['content-type'].split('boundary=')[1]; final int frameBoundarySize = frameBoundary.length; @@ -56,7 +53,7 @@ class _CameraStreamViewState extends State { if (primaryBuffer.length >= imageSizeStart + 10) { contentType = utf8.decode( primaryBuffer.sublist(frameBoundarySize+16, imageSizeStart + 10), allowMalformed: true).split("\r\n")[0]; - //Logger.d("$contentType"); + useSVG = contentType == "image/svg+xml"; imageSizeStart = frameBoundarySize + 16 + contentType.length + 18; for (int i = imageSizeStart; i < primaryBuffer.length - 4; i++) { strBuffer = utf8.decode( @@ -139,15 +136,36 @@ class _CameraStreamViewState extends State { if (binaryImage.isEmpty) { return Column( children: [ - Text("$cameraState") + Container( + padding: const EdgeInsets.all(20.0), + child: const CircularProgressIndicator() + ) ], ); } else { - return Column( - children: [ - Image.memory(Uint8List.fromList(binaryImage), gaplessPlayback: true), - ], - ); + if (useSVG) { + Logger.d("Camera with SVG source"); + return Column( + children: [ + SvgPicture.memory( + Uint8List.fromList(binaryImage), + height: 200.0, + placeholderBuilder: (BuildContext context) => + new Container( + padding: const EdgeInsets.all(20.0), + child: const CircularProgressIndicator() + ), + ) + ], + ); + } else { + return Column( + children: [ + Image.memory( + Uint8List.fromList(binaryImage), gaplessPlayback: true), + ], + ); + } } } diff --git a/lib/main.dart b/lib/main.dart index cabfe0f..1efda07 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,6 +15,8 @@ import 'package:http/http.dart' as http; import 'package:charts_flutter/flutter.dart' as charts; import 'package:progress_indicators/progress_indicators.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:webview_flutter/webview_flutter.dart'; part 'entity_class/const.dart'; part 'entity_class/entity.class.dart'; diff --git a/pubspec.lock b/pubspec.lock index 2f5ed9e..853d70f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -127,6 +127,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.2.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + url: "https://pub.dartlang.org" + source: hosted + version: "0.10.3" flutter_test: dependency: "direct dev" description: flutter @@ -195,6 +202,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.6.2" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.3" path_provider: dependency: transitive description: @@ -326,13 +347,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.9" + webview_flutter: + dependency: "direct main" + description: + name: webview_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.3+1" xml: dependency: transitive description: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.3.1" + version: "3.2.5" yaml: dependency: transitive description: @@ -341,5 +369,5 @@ packages: source: hosted version: "2.1.15" sdks: - dart: ">=2.0.0 <3.0.0" - flutter: ">=0.5.6 <2.0.0" + dart: ">2.0.0 <3.0.0" + flutter: ">=0.11.9 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index ce6d7e0..70c79e9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,8 @@ dependencies: date_format: any charts_flutter: any flutter_markdown: any + flutter_svg: ^0.10.3 + webview_flutter: any dev_dependencies: flutter_test: