WIP #302 simple SVG support
This commit is contained in:
		| @@ -20,10 +20,10 @@ class _CameraStreamViewState extends State<CameraStreamView> { | |||||||
|   http.Client client; |   http.Client client; | ||||||
|   http.StreamedResponse response; |   http.StreamedResponse response; | ||||||
|   List<int> binaryImage = []; |   List<int> binaryImage = []; | ||||||
|   String cameraState = "Connecting..."; |  | ||||||
|   bool timeToStop = false; |   bool timeToStop = false; | ||||||
|   Completer streamCompleter; |   Completer streamCompleter; | ||||||
|   bool started = false; |   bool started = false; | ||||||
|  |   bool useSVG = false; | ||||||
|  |  | ||||||
|   void _connect() async { |   void _connect() async { | ||||||
|     started = true; |     started = true; | ||||||
| @@ -31,11 +31,8 @@ class _CameraStreamViewState extends State<CameraStreamView> { | |||||||
|     String streamUrl = '$homeAssistantWebHost/api/camera_proxy_stream/${_entity.entityId}?token=${_entity.attributes['access_token']}'; |     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 |     client = new http.Client(); // create a client to make api calls | ||||||
|     http.Request request = new http.Request("GET", Uri.parse(streamUrl));  // create get request |     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); |     response = await client.send(request); | ||||||
|     setState(() { |  | ||||||
|       cameraState = "Starting..."; |  | ||||||
|     }); |  | ||||||
|     Logger.d("[Received] <== ${response.headers}"); |     Logger.d("[Received] <== ${response.headers}"); | ||||||
|     String frameBoundary = response.headers['content-type'].split('boundary=')[1]; |     String frameBoundary = response.headers['content-type'].split('boundary=')[1]; | ||||||
|     final int frameBoundarySize = frameBoundary.length; |     final int frameBoundarySize = frameBoundary.length; | ||||||
| @@ -56,7 +53,7 @@ class _CameraStreamViewState extends State<CameraStreamView> { | |||||||
|             if (primaryBuffer.length >= imageSizeStart + 10) { |             if (primaryBuffer.length >= imageSizeStart + 10) { | ||||||
|               contentType = utf8.decode( |               contentType = utf8.decode( | ||||||
|                   primaryBuffer.sublist(frameBoundarySize+16, imageSizeStart + 10), allowMalformed: true).split("\r\n")[0]; |                   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; |               imageSizeStart = frameBoundarySize + 16 + contentType.length + 18; | ||||||
|               for (int i = imageSizeStart; i < primaryBuffer.length - 4; i++) { |               for (int i = imageSizeStart; i < primaryBuffer.length - 4; i++) { | ||||||
|                 strBuffer = utf8.decode( |                 strBuffer = utf8.decode( | ||||||
| @@ -139,17 +136,38 @@ class _CameraStreamViewState extends State<CameraStreamView> { | |||||||
|     if (binaryImage.isEmpty) { |     if (binaryImage.isEmpty) { | ||||||
|       return Column( |       return Column( | ||||||
|         children: <Widget>[ |         children: <Widget>[ | ||||||
|           Text("$cameraState") |           Container( | ||||||
|  |               padding: const EdgeInsets.all(20.0), | ||||||
|  |               child: const CircularProgressIndicator() | ||||||
|  |           ) | ||||||
|  |         ], | ||||||
|  |       ); | ||||||
|  |     } else { | ||||||
|  |       if (useSVG) { | ||||||
|  |         Logger.d("Camera with SVG source"); | ||||||
|  |         return Column( | ||||||
|  |           children: <Widget>[ | ||||||
|  |             SvgPicture.memory( | ||||||
|  |               Uint8List.fromList(binaryImage), | ||||||
|  |               height: 200.0, | ||||||
|  |               placeholderBuilder: (BuildContext context) => | ||||||
|  |               new Container( | ||||||
|  |                   padding: const EdgeInsets.all(20.0), | ||||||
|  |                   child: const CircularProgressIndicator() | ||||||
|  |               ), | ||||||
|  |             ) | ||||||
|           ], |           ], | ||||||
|         ); |         ); | ||||||
|       } else { |       } else { | ||||||
|         return Column( |         return Column( | ||||||
|           children: <Widget>[ |           children: <Widget>[ | ||||||
|           Image.memory(Uint8List.fromList(binaryImage), gaplessPlayback: true), |             Image.memory( | ||||||
|  |                 Uint8List.fromList(binaryImage), gaplessPlayback: true), | ||||||
|           ], |           ], | ||||||
|         ); |         ); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   void dispose() { |   void dispose() { | ||||||
|   | |||||||
| @@ -15,6 +15,8 @@ import 'package:http/http.dart' as http; | |||||||
| import 'package:charts_flutter/flutter.dart' as charts; | import 'package:charts_flutter/flutter.dart' as charts; | ||||||
| import 'package:progress_indicators/progress_indicators.dart'; | import 'package:progress_indicators/progress_indicators.dart'; | ||||||
| import 'package:flutter_markdown/flutter_markdown.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/const.dart'; | ||||||
| part 'entity_class/entity.class.dart'; | part 'entity_class/entity.class.dart'; | ||||||
|   | |||||||
							
								
								
									
										34
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -127,6 +127,13 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "0.2.0" |     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: |   flutter_test: | ||||||
|     dependency: "direct dev" |     dependency: "direct dev" | ||||||
|     description: flutter |     description: flutter | ||||||
| @@ -195,6 +202,20 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.6.2" |     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: |   path_provider: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -326,13 +347,20 @@ packages: | |||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.0.9" |     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: |   xml: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|       name: xml |       name: xml | ||||||
|       url: "https://pub.dartlang.org" |       url: "https://pub.dartlang.org" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "3.3.1" |     version: "3.2.5" | ||||||
|   yaml: |   yaml: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -341,5 +369,5 @@ packages: | |||||||
|     source: hosted |     source: hosted | ||||||
|     version: "2.1.15" |     version: "2.1.15" | ||||||
| sdks: | sdks: | ||||||
|   dart: ">=2.0.0 <3.0.0" |   dart: ">2.0.0 <3.0.0" | ||||||
|   flutter: ">=0.5.6 <2.0.0" |   flutter: ">=0.11.9 <2.0.0" | ||||||
|   | |||||||
| @@ -18,6 +18,8 @@ dependencies: | |||||||
|   date_format: any |   date_format: any | ||||||
|   charts_flutter: any |   charts_flutter: any | ||||||
|   flutter_markdown: any |   flutter_markdown: any | ||||||
|  |   flutter_svg: ^0.10.3 | ||||||
|  |   webview_flutter: any | ||||||
|  |  | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   flutter_test: |   flutter_test: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user