Update video flux + add interactive viewer

This commit is contained in:
Thomas Fransolet 2024-01-24 16:00:41 +01:00
parent 091b89d894
commit 9855c6632e
26 changed files with 127 additions and 103 deletions

View File

@ -99,6 +99,12 @@ android {
*/
packagingOptions {
// Fixes duplicate libraries build issue,
// when your project uses more than one plugin that depend on C++ libs.
pickFirst 'lib/**/libc++_shared.so'
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
@ -116,6 +122,9 @@ android {
minifyEnabled true
shrinkResources true
debuggable false
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
}

1
android/app/proguard-rules.pro vendored Normal file
View File

@ -0,0 +1 @@
-keep class org.videolan.libvlc.** { *; }

View File

@ -1,6 +1,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="be.unov.myhomie">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:label="MyHomie"
android:usesCleartextTraffic="true"
@ -11,6 +13,8 @@
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:resizeableActivity="true"
android:requestLegacyExternalStorage="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
@ -32,6 +36,9 @@
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@drawable/launch_background"
/>
<meta-data
android:name="android.allow_multiple_resumed_activities"
android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

View File

@ -1,5 +1,5 @@
#Fri Sep 01 08:41:57 CEST 2023
VERSION_BUILD=91
#Wed Jan 17 10:40:29 CET 2024
VERSION_BUILD=99
VERSION_MAJOR=1
VERSION_MINOR=0
VERSION_PATCH=0

View File

@ -5,7 +5,6 @@ import 'package:myhomie_app/Screens/Main/index.dart';
import 'package:myhomie_app/constants.dart';
import 'package:provider/provider.dart';
import 'custom_clipper.dart';
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
final double _preferredHeight = 50;

View File

@ -44,10 +44,10 @@ class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
),*/
child: Row( //children inside bottom appbar
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Container(
width: size.width *0.4,
width: size.width *0.35,
//color: Colors.greenAccent,
child: Row(
mainAxisSize: MainAxisSize.max,
@ -60,7 +60,7 @@ class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
),
SizedBox(width: size.width *0.2, /*child: Container(color: Colors.green,)*/),
Container(
width: size.width *0.4,
width: size.width *0.35,
//color: Colors.greenAccent,
child: Row(
mainAxisSize: MainAxisSize.max,

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flare_flutter/flare_actor.dart';
import 'package:myhomie_app/Screens/Main/MainPage.dart';
import 'package:myhomie_app/Screens/Main/index.dart';
import 'package:myhomie_app/constants.dart';
@ -25,7 +24,7 @@ class CustomNavItem extends StatelessWidget {
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
color: kMainColor,
color: id == 0 ? kMainColor : null,
),
width: 55,
height: 55,

View File

@ -50,14 +50,13 @@ class _CheckInputContainerState extends State<CheckInputContainer> {
size: 25.0,
),
),
if(widget.label != null)
AutoSizeText(
widget.label,
style: new TextStyle(fontSize: widget.fontSize, fontWeight: FontWeight.w300),
maxLines: 2,
maxFontSize: widget.fontSize,
textAlign: TextAlign.center,
),
AutoSizeText(
widget.label,
style: new TextStyle(fontSize: widget.fontSize, fontWeight: FontWeight.w300),
maxLines: 2,
maxFontSize: widget.fontSize,
textAlign: TextAlign.center,
),
],
),
Padding(

View File

@ -1,4 +1,3 @@
import 'dart:convert';
import 'package:myhomie_app/Models/homieContext.dart';
import 'package:path/path.dart';

View File

@ -1,6 +1,5 @@
import 'dart:convert';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
import 'package:myhomie_app/Models/homieContext.dart';
@ -69,11 +68,7 @@ class MQTTHelper {
}
Future<MqttServerClient?> connect(dynamic appContext) async {
HomieAppContext homieAppContext = appContext.getContext();
if (homieAppContext == null) {
homieAppContext = new HomieAppContext(host: '192.168.31.140', userId: 'TODO');
} // TO DEBUG
HomieAppContext homieAppContext = appContext.getContext(); // TO DEBUG
print(homieAppContext.host);

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:myhomie_app/Components/custom_dialog.dart';
import 'package:myhomie_app/Helpers/PushNotificationService.dart';

View File

@ -1,7 +1,6 @@
import 'dart:io';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:myhomie_app/Helpers/NotificationManager.dart';

View File

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
import 'dart:convert';
import 'package:myhomie_app/client.dart';

View File

@ -1,6 +1,5 @@
import 'package:flare_flutter/flare_actor.dart';
import 'package:flutter/material.dart';
import 'package:myhomie_app/Helpers/MQTTHelper.dart';
import 'package:myhomie_app/app_context.dart';
import 'package:provider/provider.dart';

View File

@ -1,13 +1,9 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:mycore_api/api.dart';
import 'package:mycore_api/api.dart' as API;
import 'package:myhomie_app/Components/Alarms/getCurrentAlarmModeIcon.dart';
import 'package:myhomie_app/Components/Custom_Navigation_Bar/CustomAppBar.dart';
import 'package:myhomie_app/Components/check_input_container.dart';
import 'package:myhomie_app/Components/loading_common.dart';
import 'package:myhomie_app/Components/string_input_container.dart';
import 'package:myhomie_app/Models/homieContext.dart';

View File

@ -1,13 +1,8 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:mycore_api/api.dart';
import 'package:mycore_api/api.dart' as API;
import 'package:myhomie_app/Components/Alarms/getCurrentAlarmModeIcon.dart';
import 'package:myhomie_app/Components/Custom_Navigation_Bar/CustomAppBar.dart';
import 'package:myhomie_app/Components/check_input_container.dart';
import 'package:myhomie_app/Components/loading_common.dart';
import 'package:myhomie_app/Components/string_input_container.dart';
import 'package:myhomie_app/Models/homieContext.dart';

View File

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:mycore_api/api.dart';
import 'package:myhomie_app/Components/loading.dart';
import 'package:myhomie_app/Components/loading_common.dart';
import 'package:myhomie_app/Models/homieContext.dart';
import 'package:myhomie_app/Screens/Main/Home/roomDetailPage.dart';

View File

@ -1,15 +1,10 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:mycore_api/api.dart';
import 'package:mycore_api/api.dart' as API;
import 'package:myhomie_app/Components/Alarms/getCurrentAlarmModeIcon.dart';
import 'package:myhomie_app/Components/Custom_Navigation_Bar/CustomAppBar.dart';
import 'package:myhomie_app/Components/check_input_container.dart';
import 'package:myhomie_app/Components/loading_common.dart';
import 'package:myhomie_app/Components/string_input_container.dart';
import 'package:myhomie_app/Models/homieContext.dart';
import 'package:myhomie_app/Screens/Main/Devices/deviceDetailPage.dart';
import 'package:myhomie_app/app_context.dart';

View File

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:mqtt_client/mqtt_server_client.dart';
import 'package:myhomie_app/Components/Custom_Navigation_Bar/custom_app_bar.dart';
import 'package:myhomie_app/Components/Custom_Navigation_Bar/custom_bottom_navigation_bar.dart';
@ -16,7 +15,6 @@ import 'package:provider/provider.dart';
import '../../Models/homieContext.dart';
import 'Energy/energy.dart';
import 'Home/home.dart';
import 'Profile/profile.dart';
import 'Security/security.dart';
import 'index.dart';
@ -106,39 +104,7 @@ class _MainPageState extends State<MainPage> {
],
),
),
floatingActionButton: FloatingActionButton(
backgroundColor: kMainColor,
onPressed: () {
/* var message = {
"userId": homieAppContext.userId,
"width": size.width,
"height": size.height,
"action": "button0"
};
const pubTopic = 'rpiZero/test';
final builder = MqttClientPayloadBuilder();
builder.addString(jsonEncode(message));
homieAppContext.clientMQTT.publishMessage(pubTopic, MqttQos.atLeastOnce, builder.payload);
var message2 = {
"state": "toggle"
};
const pubTopic2 = 'zigbee2mqtt/GU10Bureau/set';
final builder2 = MqttClientPayloadBuilder();
builder2.addString(jsonEncode(message2));
print("Send request");
homieAppContext.clientMQTT.publishMessage(pubTopic2, MqttQos.atLeastOnce, builder2.payload);
*/
},
child: CustomNavItem(setPage: setPage, icon: NavItemIcon.home, id: 0),
),
floatingActionButton: CustomNavItem(setPage: setPage, icon: NavItemIcon.home, id: 0),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
bottomNavigationBar: CustomBottomNavigationBar(),
),

View File

@ -1,5 +1,3 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:mycore_api/api.dart';

View File

@ -6,6 +6,7 @@ import 'package:myhomie_app/Models/homieContext.dart';
import 'package:myhomie_app/Screens/Main/Security/alarmDetailPage.dart';
import 'package:myhomie_app/Screens/Main/Security/changeAlarmMode.dart';
import 'package:myhomie_app/Screens/Main/Security/streamWidget.dart';
import 'package:myhomie_app/Screens/Main/Security/videoPlayerNetwork.dart';
import 'package:myhomie_app/app_context.dart';
import 'package:myhomie_app/constants.dart';
import 'package:provider/provider.dart';
@ -112,9 +113,9 @@ class _SecurityScreenState extends State<SecurityScreen> {
Container(
height: size.height * 0.3,
width: size.width * 0.9,
child: ImageStreamWidget(
child: VideoPlayerNetwork(initialFluxUrl: "http://192.168.31.140:8765/picture/4/current")/*ImageStreamWidget(
initialImageUrl: "http://192.168.31.140:8765/picture/4/current",
) /*VideoPlayerWidget(
)*/ /*VideoPlayerWidget(
videoUrl: "http://192.168.31.140:8084/", //"http://192.168.31.140:8084/",
)*/,
),

View File

@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:flutter_vlc_player/flutter_vlc_player.dart';
class VideoPlayerNetwork extends StatefulWidget {
final String initialFluxUrl;
VideoPlayerNetwork({required this.initialFluxUrl});
@override
_VideoPlayerNetworkState createState() => _VideoPlayerNetworkState();
}
class _VideoPlayerNetworkState extends State<VideoPlayerNetwork> {
late VlcPlayerController _videoPlayerController;
@override
void initState() {
super.initState();
_videoPlayerController = VlcPlayerController.network(
'rtsp://192.168.31.110/live0', // 'http://192.168.31.140:8084'
hwAcc: HwAcc.full,
autoPlay: true,
options: VlcPlayerOptions(rtp: VlcRtpOptions([
VlcRtpOptions.rtpOverRtsp(true),
])),
);
}
@override
void dispose() async {
super.dispose();
await _videoPlayerController.stopRendererScanning();
await _videoPlayerController.dispose();
}
@override
Widget build(BuildContext context) {
return Center(
child: Container(
width: 500,
height: 500,
child: InteractiveViewer(
child: VlcPlayer(
controller: _videoPlayerController,
aspectRatio: 16 / 9,
placeholder: Center(child: CircularProgressIndicator()),
),
),
),
);
}
}

View File

@ -1,6 +1,4 @@
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';
import 'package:myhomie_app/Helpers/PushNotificationService.dart';
import 'package:myhomie_app/client.dart';
import 'package:provider/provider.dart';
@ -35,7 +33,7 @@ void main() async {
final MyApp myApp = MyApp(
initialRoute: initialRoute,
homieAppContext: localContext!,
homieAppContext: localContext,
);
await Firebase.initializeApp();

View File

@ -8,9 +8,11 @@ import Foundation
import firebase_core
import firebase_messaging
import sqflite
import video_player_avfoundation
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin"))
FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin"))
SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin"))
FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin"))
}

View File

@ -157,10 +157,10 @@ packages:
dependency: transitive
description:
name: collection
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev"
source: hosted
version: "1.17.2"
version: "1.18.0"
convert:
dependency: transitive
description:
@ -323,6 +323,22 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_vlc_player:
dependency: "direct main"
description:
name: flutter_vlc_player
sha256: b869251c9b186f2e3d21c103734e842c90cb5b2d46af0c35c6ecc4c46cdefce6
url: "https://pub.dev"
source: hosted
version: "7.4.1"
flutter_vlc_player_platform_interface:
dependency: transitive
description:
name: flutter_vlc_player_platform_interface
sha256: b161dde841368d330be82c5ee6f40b29dadc4227167bf2770d949f576ae2d9b1
url: "https://pub.dev"
source: hosted
version: "2.0.3"
flutter_web_plugins:
dependency: transitive
description: flutter
@ -452,10 +468,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
url: "https://pub.dev"
source: hosted
version: "1.9.1"
version: "1.10.0"
mime:
dependency: transitive
description:
@ -648,18 +664,18 @@ packages:
dependency: transitive
description:
name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.dev"
source: hosted
version: "1.11.0"
version: "1.11.1"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev"
source: hosted
version: "2.1.1"
version: "2.1.2"
stream_transform:
dependency: transitive
description:
@ -696,10 +712,10 @@ packages:
dependency: transitive
description:
name: test_api
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8"
sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
url: "https://pub.dev"
source: hosted
version: "0.6.0"
version: "0.6.1"
timer_builder:
dependency: "direct main"
description:
@ -768,10 +784,10 @@ packages:
dependency: "direct main"
description:
name: video_player
sha256: "3fd106c74da32f336dc7feb65021da9b0207cb3124392935f1552834f7cce822"
sha256: fbf28ce8bcfe709ad91b5789166c832cb7a684d14f571a81891858fefb5bb1c2
url: "https://pub.dev"
source: hosted
version: "2.7.0"
version: "2.8.2"
video_player_android:
dependency: transitive
description:
@ -784,10 +800,10 @@ packages:
dependency: transitive
description:
name: video_player_avfoundation
sha256: f5f5b7fe8c865be8a57fe80c2dca130772e1db775b7af4e5c5aa1905069cfc6c
sha256: "309e3962795e761be010869bae65c0b0e45b5230c5cee1bec72197ca7db040ed"
url: "https://pub.dev"
source: hosted
version: "2.4.9"
version: "2.5.6"
video_player_platform_interface:
dependency: transitive
description:
@ -816,10 +832,10 @@ packages:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
version: "0.3.0"
web_socket_channel:
dependency: transitive
description:
@ -845,5 +861,5 @@ packages:
source: hosted
version: "3.1.2"
sdks:
dart: ">=3.1.0-185.0.dev <3.3.0"
flutter: ">=3.7.0-0"
dart: ">=3.2.0 <3.3.0"
flutter: ">=3.16.0"

View File

@ -44,8 +44,9 @@ dependencies:
auto_size_text: ^3.0.0
firebase_core: ^2.15.0
firebase_messaging: ^14.6.6
video_player: ^2.7.0
video_player: ^2.8.2
timer_builder: ^2.0.0
flutter_vlc_player: ^7.4.1
dev_dependencies:
flutter_test: