WIP #302 simple SVG support
This commit is contained in:
parent
538d3603dc
commit
76057e8797
@ -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