diff --git a/packages/hmssdk_flutter/lib/src/ui/meeting/hms_texture_view.dart b/packages/hmssdk_flutter/lib/src/ui/meeting/hms_texture_view.dart index db56abf40..2d9aa64f9 100644 --- a/packages/hmssdk_flutter/lib/src/ui/meeting/hms_texture_view.dart +++ b/packages/hmssdk_flutter/lib/src/ui/meeting/hms_texture_view.dart @@ -118,6 +118,14 @@ class _PlatformViewState extends State<_PlatformView> { widget.disableAutoSimulcastLayerSelect); } else { viewController = widget.controller; + + ///Calling Add Track with new track in case where the addTrack is not called by the app + if (!widget.track.isMute) { + viewController?.addTrack( + track: widget.track as HMSVideoTrack, + disableAutoSimulcastLayerSelect: + widget.disableAutoSimulcastLayerSelect); + } } ///Here we set the callback method which gets called to set the view diff --git a/sample apps/bloc/android/app/build.gradle b/sample apps/bloc/android/app/build.gradle index 0a017cb5d..d144e1d6c 100644 --- a/sample apps/bloc/android/app/build.gradle +++ b/sample apps/bloc/android/app/build.gradle @@ -26,8 +26,8 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 32 - + compileSdkVersion 34 + namespace 'com.example.demo_app_with_100ms_and_bloc' compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 @@ -45,7 +45,8 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.demo_app_with_100ms_and_bloc" minSdkVersion 21 - targetSdkVersion flutter.targetSdkVersion + targetSdkVersion 34 + multiDexEnabled true versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/sample apps/bloc/android/gradle/wrapper/gradle-wrapper.properties b/sample apps/bloc/android/gradle/wrapper/gradle-wrapper.properties index bc6a58afd..ffed3a254 100644 --- a/sample apps/bloc/android/gradle/wrapper/gradle-wrapper.properties +++ b/sample apps/bloc/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Fri Jun 23 08:50:38 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/sample apps/bloc/lib/observers/room_observer.dart b/sample apps/bloc/lib/observers/room_observer.dart index d13e3a5a8..58d5c1a31 100644 --- a/sample apps/bloc/lib/observers/room_observer.dart +++ b/sample apps/bloc/lib/observers/room_observer.dart @@ -172,4 +172,11 @@ class RoomObserver implements HMSUpdateListener, HMSActionResultListener { void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { // TODO: implement onSessionStoreAvailable } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } } diff --git a/sample apps/bloc/pubspec.lock b/sample apps/bloc/pubspec.lock index a2aba3ffb..516055fe4 100644 --- a/sample apps/bloc/pubspec.lock +++ b/sample apps/bloc/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.17.2" cupertino_icons: dependency: "direct main" description: @@ -111,10 +111,10 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: "58c9c104b928ca62af8cd6b8a826ffef27e727a412d854b98e7f1fb151832d5e" + sha256: bfa6e6ec411d6f86f6cc054936fb2163c4cd3f8703f8848099689652b3794376 url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.10.1" http: dependency: "direct main" description: @@ -159,10 +159,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" nested: dependency: transitive description: @@ -260,18 +260,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" string_scanner: dependency: transitive description: @@ -292,10 +292,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.6.0" typed_data: dependency: transitive description: @@ -324,10 +324,10 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.1.4-beta" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=2.10.0" diff --git a/sample apps/bloc/pubspec.yaml b/sample apps/bloc/pubspec.yaml index 1f6606b59..2a86bc316 100644 --- a/sample apps/bloc/pubspec.yaml +++ b/sample apps/bloc/pubspec.yaml @@ -36,7 +36,7 @@ dependencies: focus_detector: http: rxdart: ^0.27.2 - hmssdk_flutter: 1.7.2 + hmssdk_flutter: 1.10.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. diff --git a/sample apps/flutter-audio-room-quickstart/README.md b/sample apps/flutter-audio-room-quickstart/README.md index d7120d5b0..5f9c32be5 100644 --- a/sample apps/flutter-audio-room-quickstart/README.md +++ b/sample apps/flutter-audio-room-quickstart/README.md @@ -9,7 +9,7 @@ Create an `audio room` template from [100ms dashboard](https://dashboard.100ms.l Just plugin following values and run the application : - userName : Enter the username with which you wish to join -- authToken : Auth token of the role with which you wish to join the room +- roomCode : Room Code of the role with which you wish to join the room That's it. Press the `Join Audio Room` button and start conversing 🥳🥳🥳 diff --git a/sample apps/flutter-audio-room-quickstart/android/app/build.gradle b/sample apps/flutter-audio-room-quickstart/android/app/build.gradle index b2f840571..e0103dd4b 100644 --- a/sample apps/flutter-audio-room-quickstart/android/app/build.gradle +++ b/sample apps/flutter-audio-room-quickstart/android/app/build.gradle @@ -26,7 +26,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -47,7 +47,7 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 21 - targetSdkVersion 33 + targetSdkVersion 34 versionCode 1 versionName "1.0.0" } diff --git a/sample apps/flutter-audio-room-quickstart/android/app/src/main/AndroidManifest.xml b/sample apps/flutter-audio-room-quickstart/android/app/src/main/AndroidManifest.xml index 90ce195e1..f02b2a957 100644 --- a/sample apps/flutter-audio-room-quickstart/android/app/src/main/AndroidManifest.xml +++ b/sample apps/flutter-audio-room-quickstart/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,23 @@ + + + + + + + + + + + + + + + + + + { bool res = false; + void navigate() { + Navigator.push( + context, CupertinoPageRoute(builder: (_) => const MeetingPage())); + } + static Future getPermissions() async { if (Platform.isIOS) return true; @@ -59,21 +64,20 @@ class _MyHomePageState extends State { child: Center( child: ElevatedButton( style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.blue), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ))), + borderRadius: BorderRadius.circular(8.0), + ))), onPressed: () async => { res = await getPermissions(), - if (res) - Navigator.push(context, - CupertinoPageRoute(builder: (_) => const MeetingPage())) + if (res) {navigate()} }, child: const Padding( padding: EdgeInsets.symmetric(vertical: 20, horizontal: 15), child: Text( 'Join Audio Room', - style: TextStyle(fontSize: 20), + style: TextStyle(fontSize: 20, color: Colors.white), ), ), ), @@ -95,8 +99,11 @@ class _MeetingPageState extends State late HMSSDK _hmsSDK; //Enter the username and authToken from dashboard for the corresponding role here. - String userName = "Enter Username Here"; - String authToken = "Enter AuthToken Here"; + String userName = "Enter username here"; + + ///For speaker role roomCode: "yim-wofo-ytk" + ///For listener role roomCode: "iai-nkis-oob" + String roomCode = "yim-wofo-ytk"; Offset position = const Offset(5, 5); bool isJoinSuccessful = false; final List _listeners = []; @@ -115,7 +122,12 @@ class _MeetingPageState extends State _hmsSDK = HMSSDK(); await _hmsSDK.build(); _hmsSDK.addUpdateListener(listener: this); - _hmsSDK.join(config: HMSConfig(authToken: authToken, userName: userName)); + var authToken = await _hmsSDK.getAuthTokenByRoomCode(roomCode: roomCode); + if ((authToken is String?) && authToken != null) { + _hmsSDK.join(config: HMSConfig(authToken: authToken, userName: userName)); + } else { + log("Error in getting auth token"); + } } @override @@ -271,6 +283,9 @@ class _MeetingPageState extends State case HMSPeerUpdate.networkQualityUpdated: // TODO: Handle this case. break; + case HMSPeerUpdate.handRaiseUpdated: + // TODO: Handle this case. + break; } } @@ -399,6 +414,18 @@ class _MeetingPageState extends State // Checkout the docs for room updates here: https://www.100ms.live/docs/flutter/v2/how--to-guides/listen-to-room-updates/update-listeners } + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } + + @override + void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { + // TODO: implement onSessionStoreAvailable + } + @override void onUpdateSpeakers({required List updateSpeakers}) { // Checkout the docs for handling the updates regarding who is currently speaking here: https://www.100ms.live/docs/flutter/v2/how--to-guides/set-up-video-conferencing/render-video/show-audio-level diff --git a/sample apps/flutter-audio-room-quickstart/pubspec.lock b/sample apps/flutter-audio-room-quickstart/pubspec.lock index 802acb7e2..36846d1e9 100644 --- a/sample apps/flutter-audio-room-quickstart/pubspec.lock +++ b/sample apps/flutter-audio-room-quickstart/pubspec.lock @@ -79,10 +79,34 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: f811c32ac86850039059e939c4a29906cbcc0f04fb96dcc5edee01d6596ae085 + sha256: b3f1438c5146afe0399935d78820357bf548b0e3ea36f9355878670ccc2aca6e url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.10.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -95,34 +119,34 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" permission_handler: dependency: "direct main" description: @@ -220,10 +244,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" vector_math: dependency: transitive description: @@ -232,14 +256,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - web: + vm_service: dependency: transitive description: - name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "14.2.1" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=2.8.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/sample apps/flutter-audio-room-quickstart/pubspec.yaml b/sample apps/flutter-audio-room-quickstart/pubspec.yaml index b74066370..0ae532ede 100644 --- a/sample apps/flutter-audio-room-quickstart/pubspec.yaml +++ b/sample apps/flutter-audio-room-quickstart/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - hmssdk_flutter: 1.4.0 + hmssdk_flutter: 1.10.2 permission_handler: 10.2.0 dev_dependencies: diff --git a/sample apps/flutter-hls-quickstart/README.md b/sample apps/flutter-hls-quickstart/README.md index 671c161a8..9a8b4cb7a 100644 --- a/sample apps/flutter-hls-quickstart/README.md +++ b/sample apps/flutter-hls-quickstart/README.md @@ -9,7 +9,7 @@ Create an `Live Streaming` template from [100ms dashboard](https://dashboard.100 Just plugin following values for `broadcaster` and `hls-viewer` role and run the application : - userName : Enter the username with which you wish to join -- authToken : Auth token of the role with which you wish to join the room +- roomCode : Room Code of the role with which you wish to join the room That's it. Press the `Join As Broadcaster` button to join as `broadcaster` and `Join as HLS Viewer` button to join as `hls-viewer` and start streaming 🥳🥳🥳 diff --git a/sample apps/flutter-hls-quickstart/android/build.gradle b/sample apps/flutter-hls-quickstart/android/build.gradle index 58a8c74b1..713d7f6e6 100644 --- a/sample apps/flutter-hls-quickstart/android/build.gradle +++ b/sample apps/flutter-hls-quickstart/android/build.gradle @@ -26,6 +26,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/sample apps/flutter-hls-quickstart/android/gradle/wrapper/gradle-wrapper.properties b/sample apps/flutter-hls-quickstart/android/gradle/wrapper/gradle-wrapper.properties index 3c472b99c..0e9a61051 100644 --- a/sample apps/flutter-hls-quickstart/android/gradle/wrapper/gradle-wrapper.properties +++ b/sample apps/flutter-hls-quickstart/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/sample apps/flutter-hls-quickstart/ios/Flutter/AppFrameworkInfo.plist b/sample apps/flutter-hls-quickstart/ios/Flutter/AppFrameworkInfo.plist index 9625e105d..7c5696400 100644 --- a/sample apps/flutter-hls-quickstart/ios/Flutter/AppFrameworkInfo.plist +++ b/sample apps/flutter-hls-quickstart/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/sample apps/flutter-hls-quickstart/ios/Podfile.lock b/sample apps/flutter-hls-quickstart/ios/Podfile.lock index 6781a0aba..67ab9ce25 100644 --- a/sample apps/flutter-hls-quickstart/ios/Podfile.lock +++ b/sample apps/flutter-hls-quickstart/ios/Podfile.lock @@ -1,15 +1,20 @@ PODS: - Flutter (1.0.0) - HMSAnalyticsSDK (0.0.2) - - HMSBroadcastExtensionSDK (0.0.8) - - HMSSDK (0.9.1): + - HMSBroadcastExtensionSDK (0.0.9) + - HMSHLSPlayerSDK (0.0.2): - HMSAnalyticsSDK (= 0.0.2) - - HMSWebRTC (= 1.0.5115) - - hmssdk_flutter (1.4.0): + - HMSNoiseCancellationModels (1.0.0) + - HMSSDK (1.10.0): + - HMSAnalyticsSDK (= 0.0.2) + - HMSWebRTC (= 1.0.6169) + - hmssdk_flutter (1.10.2): - Flutter - - HMSBroadcastExtensionSDK (= 0.0.8) - - HMSSDK (= 0.9.1) - - HMSWebRTC (1.0.5115) + - HMSBroadcastExtensionSDK (= 0.0.9) + - HMSHLSPlayerSDK (= 0.0.2) + - HMSNoiseCancellationModels (= 1.0.0) + - HMSSDK (= 1.10.0) + - HMSWebRTC (1.0.6169) - permission_handler_apple (9.0.4): - Flutter - video_player_avfoundation (0.0.1): @@ -25,6 +30,8 @@ SPEC REPOS: trunk: - HMSAnalyticsSDK - HMSBroadcastExtensionSDK + - HMSHLSPlayerSDK + - HMSNoiseCancellationModels - HMSSDK - HMSWebRTC @@ -39,15 +46,17 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/video_player_avfoundation/ios" SPEC CHECKSUMS: - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 HMSAnalyticsSDK: 4d2a88a729b1eb42f3d25f217c28937ec318a5b7 - HMSBroadcastExtensionSDK: 4393faac38999d01bae8e411d0564a577ad9d89a - HMSSDK: e1a2d6dc4f4881b7e6a854de61a06e2cc0afc848 - hmssdk_flutter: c8ba76a719d8b9bd2b98b40fbf4cbe2332029ea8 - HMSWebRTC: d74cd5e5ecfe701219dd4042ec67fed02ea5d6db + HMSBroadcastExtensionSDK: d80fe325f6c928bd8e5176290b5a4b7ae15d6fbb + HMSHLSPlayerSDK: 6a54ad4d12f3dc2270d1ecd24019d71282a4f6a3 + HMSNoiseCancellationModels: a3bda1405a16015632f4bcabd46ce48f35103b02 + HMSSDK: fbbdebf673baba7f98f3fa13241b4249929ad681 + hmssdk_flutter: 9be13b77e2a55dba665e154cae026d2b5cdfa053 + HMSWebRTC: 8f51ba33a0e505e17ebf3d7b37bcdca266751a13 permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 PODFILE CHECKSUM: 4e8f8b2be68aeea4c0d5beb6ff1e79fface1d048 -COCOAPODS: 1.12.0 +COCOAPODS: 1.14.3 diff --git a/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/project.pbxproj b/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/project.pbxproj index 0e44d71de..fa8abe038 100644 --- a/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/project.pbxproj +++ b/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/project.pbxproj @@ -156,7 +156,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -205,6 +205,7 @@ files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -342,7 +343,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -420,7 +421,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -469,7 +470,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a33..5e31d3d34 100644 --- a/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/sample apps/flutter-hls-quickstart/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ { return true; } + void navigateHLSUser() { + Navigator.push( + context, + CupertinoPageRoute( + builder: (_) => HLSViewerPage( + roomCode: "luh-piuh-now", + /* + * Paste room code for your Room from 100ms Dashboard here + * https://dashboard.100ms.live/ + */ + userName: userName))); + } + + void navigateBroadcaster() { + Navigator.push( + context, + CupertinoPageRoute( + builder: (_) => MeetingPage( + roomCode: "trp-lzec-yoc", + /* + * Paste room code for your Room from 100ms Dashboard here + * https://dashboard.100ms.live/ + */ + userName: userName))); + } + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( + backgroundColor: Colors.blue, title: Text(widget.title), ), body: Container( @@ -70,29 +98,21 @@ class _MyHomePageState extends State { //Button to join as broadcaster ElevatedButton( style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.blue), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ))), + borderRadius: BorderRadius.circular(8.0), + ))), onPressed: () async => { res = await getPermissions(), - if (res) - Navigator.push( - context, - CupertinoPageRoute( - builder: (_) => MeetingPage( - authToken: "ENTER YOUR AUTH TOKEN HERE", - /* - * Paste Auth Token for your Room from 100ms Dashboard here - * https://dashboard.100ms.live/ - */ - userName: userName))) + if (res) {navigateBroadcaster()} }, child: const Padding( padding: EdgeInsets.symmetric(vertical: 20, horizontal: 20), child: Text( 'Join as Broadcaster', - style: TextStyle(fontSize: 20), + style: TextStyle(fontSize: 20, color: Colors.white), ), ), ), @@ -102,29 +122,21 @@ class _MyHomePageState extends State { //Button to join as HLSViewer ElevatedButton( style: ButtonStyle( + backgroundColor: + MaterialStateProperty.all(Colors.blue), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ))), + borderRadius: BorderRadius.circular(8.0), + ))), onPressed: () async => { res = await getPermissions(), - if (res) - Navigator.push( - context, - CupertinoPageRoute( - builder: (_) => HLSViewerPage( - authToken: "ENTER YOUR AUTH TOKEN HERE", - /* - * Paste Auth Token for your Room from 100ms Dashboard here - * https://dashboard.100ms.live/ - */ - userName: userName))) + if (res) {navigateHLSUser()} }, child: const Padding( padding: EdgeInsets.symmetric(vertical: 20, horizontal: 20), child: Text( 'Join as HLS Viewer', - style: TextStyle(fontSize: 20), + style: TextStyle(fontSize: 20, color: Colors.white), ), ), ), @@ -136,10 +148,10 @@ class _MyHomePageState extends State { } class MeetingPage extends StatefulWidget { - final String authToken; + final String roomCode; final String userName; const MeetingPage( - {super.key, required this.authToken, required this.userName}); + {super.key, required this.roomCode, required this.userName}); @override State createState() => _MeetingPageState(); @@ -162,9 +174,14 @@ class _MeetingPageState extends State _hmsSDK = HMSSDK(); await _hmsSDK.build(); _hmsSDK.addUpdateListener(listener: this); - _hmsSDK.join( - config: - HMSConfig(authToken: widget.authToken, userName: widget.userName)); + var authToken = + await _hmsSDK.getAuthTokenByRoomCode(roomCode: widget.roomCode); + if ((authToken is String?) && authToken != null) { + _hmsSDK.join( + config: HMSConfig(authToken: authToken, userName: widget.userName)); + } else { + log("Error in getting auth token"); + } } @override @@ -326,6 +343,18 @@ class _MeetingPageState extends State // Checkout the docs for handling the updates regarding who is currently speaking here: https://www.100ms.live/docs/flutter/v2/how--to-guides/set-up-video-conferencing/render-video/show-audio-level } + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } + + @override + void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { + // TODO: implement onSessionStoreAvailable + } + void _leaveRoom() { _hmsSDK.leave(); _hmsSDK.removeUpdateListener(listener: this); @@ -508,10 +537,10 @@ class _MeetingPageState extends State } class HLSViewerPage extends StatefulWidget { - final String authToken; + final String roomCode; final String userName; const HLSViewerPage( - {super.key, required this.authToken, required this.userName}); + {super.key, required this.roomCode, required this.userName}); @override State createState() => _HLSViewerPageState(); @@ -534,9 +563,14 @@ class _HLSViewerPageState extends State _hmsSDK = HMSSDK(); await _hmsSDK.build(); _hmsSDK.addUpdateListener(listener: this); - _hmsSDK.join( - config: - HMSConfig(authToken: widget.authToken, userName: widget.userName)); + var authToken = + await _hmsSDK.getAuthTokenByRoomCode(roomCode: widget.roomCode); + if ((authToken is String?) && authToken != null) { + _hmsSDK.join( + config: HMSConfig(authToken: authToken, userName: widget.userName)); + } else { + log("Error in getting auth token"); + } } @override @@ -640,6 +674,18 @@ class _HLSViewerPageState extends State // Checkout the docs for handling the updates regarding who is currently speaking here: https://www.100ms.live/docs/flutter/v2/how--to-guides/set-up-video-conferencing/render-video/show-audio-level } + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } + + @override + void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { + // TODO: implement onSessionStoreAvailable + } + void _leaveRoom() { _hmsSDK.leave(); _hmsSDK.removeUpdateListener(listener: this); diff --git a/sample apps/flutter-hls-quickstart/pubspec.lock b/sample apps/flutter-hls-quickstart/pubspec.lock index e93e320f7..27cbc5c7d 100644 --- a/sample apps/flutter-hls-quickstart/pubspec.lock +++ b/sample apps/flutter-hls-quickstart/pubspec.lock @@ -92,10 +92,10 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: f811c32ac86850039059e939c4a29906cbcc0f04fb96dcc5edee01d6596ae085 + sha256: b3f1438c5146afe0399935d78820357bf548b0e3ea36f9355878670ccc2aca6e url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.10.2" html: dependency: transitive description: @@ -104,6 +104,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.15.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -116,34 +140,34 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.12.0" path: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" permission_handler: dependency: "direct main" description: @@ -241,10 +265,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.0" vector_math: dependency: transitive description: @@ -293,14 +317,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.16" - web: + vm_service: dependency: transitive description: - name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "14.2.1" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=3.3.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/sample apps/flutter-hls-quickstart/pubspec.yaml b/sample apps/flutter-hls-quickstart/pubspec.yaml index c69421c3e..d92a58966 100644 --- a/sample apps/flutter-hls-quickstart/pubspec.yaml +++ b/sample apps/flutter-hls-quickstart/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - hmssdk_flutter: 1.4.0 + hmssdk_flutter: 1.10.2 permission_handler: 10.2.0 video_player: 2.6.1 diff --git a/sample apps/flutter-meet/.flutter-plugins b/sample apps/flutter-meet/.flutter-plugins index 02dbe7aa6..bfea99bbe 100644 --- a/sample apps/flutter-meet/.flutter-plugins +++ b/sample apps/flutter-meet/.flutter-plugins @@ -1,5 +1,5 @@ # This is a generated file; do not edit or check into version control. -hmssdk_flutter=/Users/decode/.pub-cache/hosted/pub.dev/hmssdk_flutter-1.9.14/ +hmssdk_flutter=/Users/decode/.pub-cache/hosted/pub.dev/hmssdk_flutter-1.10.2/ permission_handler=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler-11.0.0/ permission_handler_android=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_android-11.0.1/ permission_handler_apple=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_apple-9.1.4/ diff --git a/sample apps/flutter-meet/android/app/build.gradle b/sample apps/flutter-meet/android/app/build.gradle index f24c1f9e2..d2448878d 100644 --- a/sample apps/flutter-meet/android/app/build.gradle +++ b/sample apps/flutter-meet/android/app/build.gradle @@ -26,7 +26,8 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 31 + namespace 'com.aditya.google_meet' + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -45,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.aditya.google_meet" minSdkVersion 21 - targetSdkVersion 31 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/sample apps/flutter-meet/android/build.gradle b/sample apps/flutter-meet/android/build.gradle index c45f25cc9..e13d3b9cd 100644 --- a/sample apps/flutter-meet/android/build.gradle +++ b/sample apps/flutter-meet/android/build.gradle @@ -1,12 +1,12 @@ buildscript { - ext.kotlin_version = '1.5.31' + ext.kotlin_version = '1.7.20' repositories { google() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.0' + classpath 'com.android.tools.build:gradle:8.0.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -24,6 +24,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/sample apps/flutter-meet/lib/services/join_service.dart b/sample apps/flutter-meet/lib/services/join_service.dart index 5cda72396..86b0f113c 100644 --- a/sample apps/flutter-meet/lib/services/join_service.dart +++ b/sample apps/flutter-meet/lib/services/join_service.dart @@ -5,8 +5,8 @@ import 'package:hmssdk_flutter/hmssdk_flutter.dart'; class JoinService { static Future join(HMSSDK hmssdk) async { - String? roomCode = getCode( - "https://mobilevideoconference.app.100ms.live/meeting/rky-hzlr-ybr"); + String? roomCode = + getCode("https://fluttersampleapp.app.100ms.live/meeting/zhr-seow-tuj"); if (roomCode == null) return false; dynamic authToken = await hmssdk.getAuthTokenByRoomCode(roomCode: roomCode); diff --git a/sample apps/flutter-meet/pubspec.lock b/sample apps/flutter-meet/pubspec.lock index 8d251ec0a..f1c8cfd68 100644 --- a/sample apps/flutter-meet/pubspec.lock +++ b/sample apps/flutter-meet/pubspec.lock @@ -37,10 +37,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" cupertino_icons: dependency: "direct main" description: @@ -87,10 +87,10 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: efc257a82187a9a5d675842650fa6ff0ff56487585dd24d38ac4237f492a21b5 + sha256: b3f1438c5146afe0399935d78820357bf548b0e3ea36f9355878670ccc2aca6e url: "https://pub.dev" source: hosted - version: "1.9.14" + version: "1.10.2" http: dependency: "direct main" description: @@ -107,6 +107,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + url: "https://pub.dev" + source: hosted + version: "10.0.4" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -119,26 +143,26 @@ packages: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.8.0" meta: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.12.0" nested: dependency: transitive description: @@ -151,10 +175,10 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" permission_handler: dependency: "direct main" description: @@ -228,18 +252,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" string_scanner: dependency: transitive description: @@ -260,10 +284,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.7.0" typed_data: dependency: transitive description: @@ -280,14 +304,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - web: + vm_service: dependency: transitive description: - name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + name: vm_service + sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "14.2.1" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" - flutter: ">=2.10.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/sample apps/flutter-meet/pubspec.yaml b/sample apps/flutter-meet/pubspec.yaml index 8920bef85..4606215fe 100644 --- a/sample apps/flutter-meet/pubspec.yaml +++ b/sample apps/flutter-meet/pubspec.yaml @@ -32,7 +32,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. - hmssdk_flutter: 1.9.14 + hmssdk_flutter: 1.10.2 permission_handler: http: 0.13.4 provider: 6.0.2 diff --git a/sample apps/flutter-quickstart-app/.flutter-plugins b/sample apps/flutter-quickstart-app/.flutter-plugins new file mode 100644 index 000000000..3647b49a7 --- /dev/null +++ b/sample apps/flutter-quickstart-app/.flutter-plugins @@ -0,0 +1,6 @@ +# This is a generated file; do not edit or check into version control. +hmssdk_flutter=/Users/decode/.pub-cache/hosted/pub.dev/hmssdk_flutter-1.10.1/ +permission_handler=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler-10.2.0/ +permission_handler_android=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.0/ +permission_handler_apple=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.7/ +permission_handler_windows=/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/ diff --git a/sample apps/flutter-quickstart-app/.flutter-plugins-dependencies b/sample apps/flutter-quickstart-app/.flutter-plugins-dependencies new file mode 100644 index 000000000..4b8f07b8f --- /dev/null +++ b/sample apps/flutter-quickstart-app/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"hmssdk_flutter","path":"/Users/decode/.pub-cache/hosted/pub.dev/hmssdk_flutter-1.10.1/","native_build":true,"dependencies":[]},{"name":"permission_handler_apple","path":"/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_apple-9.0.7/","native_build":true,"dependencies":[]}],"android":[{"name":"hmssdk_flutter","path":"/Users/decode/.pub-cache/hosted/pub.dev/hmssdk_flutter-1.10.1/","native_build":true,"dependencies":[]},{"name":"permission_handler_android","path":"/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_android-10.2.0/","native_build":true,"dependencies":[]}],"macos":[],"linux":[],"windows":[{"name":"permission_handler_windows","path":"/Users/decode/.pub-cache/hosted/pub.dev/permission_handler_windows-0.1.2/","native_build":true,"dependencies":[]}],"web":[]},"dependencyGraph":[{"name":"hmssdk_flutter","dependencies":[]},{"name":"permission_handler","dependencies":["permission_handler_android","permission_handler_apple","permission_handler_windows"]},{"name":"permission_handler_android","dependencies":[]},{"name":"permission_handler_apple","dependencies":[]},{"name":"permission_handler_windows","dependencies":[]}],"date_created":"2024-05-15 14:57:27.609037","version":"3.13.5"} \ No newline at end of file diff --git a/sample apps/flutter-quickstart-app/android/app/src/main/AndroidManifest.xml b/sample apps/flutter-quickstart-app/android/app/src/main/AndroidManifest.xml index 1ed906a0b..e892ffbc2 100644 --- a/sample apps/flutter-quickstart-app/android/app/src/main/AndroidManifest.xml +++ b/sample apps/flutter-quickstart-app/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + { bool res = false; + void navigate() { + Navigator.push( + context, CupertinoPageRoute(builder: (_) => const MeetingPage())); + } + static Future getPermissions() async { if (Platform.isIOS) return true; await Permission.camera.request(); @@ -58,21 +64,21 @@ class _MyHomePageState extends State { return Scaffold( appBar: AppBar( title: Text(widget.title), + backgroundColor: Colors.blue, ), body: Container( color: Colors.black, child: Center( child: ElevatedButton( style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.blue), shape: MaterialStateProperty.all( RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ))), + borderRadius: BorderRadius.circular(8.0), + ))), onPressed: () async => { res = await getPermissions(), - if (res) - Navigator.push(context, - CupertinoPageRoute(builder: (_) => const MeetingPage())) + if (res) {navigate()} }, child: const Padding( padding: EdgeInsets.symmetric(vertical: 20, horizontal: 20), @@ -99,7 +105,7 @@ class _MeetingPageState extends State implements HMSUpdateListener { late HMSSDK hmsSDK; String userName = "Enter username here"; - String authToken = "Enter token here"; + String roomCode = "zhr-seow-tuj"; //Enter your room code here Offset position = const Offset(5, 5); bool isJoinSuccessful = false; HMSPeer? localPeer, remotePeer; @@ -115,7 +121,12 @@ class _MeetingPageState extends State hmsSDK = HMSSDK(); await hmsSDK.build(); hmsSDK.addUpdateListener(listener: this); - hmsSDK.join(config: HMSConfig(authToken: authToken, userName: userName)); + var authToken = await hmsSDK.getAuthTokenByRoomCode(roomCode: roomCode); + if ((authToken is String?) && authToken != null) { + hmsSDK.join(config: HMSConfig(authToken: authToken, userName: userName)); + } else { + log("Error in getting auth token"); + } } @override @@ -273,6 +284,13 @@ class _MeetingPageState extends State // Checkout the docs for sessions store here: https://www.100ms.live/docs/flutter/v2/how-to-guides/interact-with-room/room/session-store } + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // Checkout the docs for onPeerListUpdate here: https://www.100ms.live/docs/flutter/v2/how--to-guides/listen-to-room-updates/update-listeners + } + @override Widget build(BuildContext context) { return WillPopScope( diff --git a/sample apps/flutter-quickstart-app/pubspec.lock b/sample apps/flutter-quickstart-app/pubspec.lock index 707d7c566..e68864eb9 100644 --- a/sample apps/flutter-quickstart-app/pubspec.lock +++ b/sample apps/flutter-quickstart-app/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.17.2" cupertino_icons: dependency: "direct main" description: @@ -79,10 +79,10 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: "58c9c104b928ca62af8cd6b8a826ffef27e727a412d854b98e7f1fb151832d5e" + sha256: bfa6e6ec411d6f86f6cc054936fb2163c4cd3f8703f8848099689652b3794376 url: "https://pub.dev" source: hosted - version: "1.7.2" + version: "1.10.1" lints: dependency: transitive description: @@ -111,10 +111,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" path: dependency: transitive description: @@ -188,18 +188,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" string_scanner: dependency: transitive description: @@ -220,10 +220,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.6.0" vector_math: dependency: transitive description: @@ -236,10 +236,10 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.1.4-beta" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=2.10.0" diff --git a/sample apps/flutter-quickstart-app/pubspec.yaml b/sample apps/flutter-quickstart-app/pubspec.yaml index 2d708271b..c4ed2ce4b 100644 --- a/sample apps/flutter-quickstart-app/pubspec.yaml +++ b/sample apps/flutter-quickstart-app/pubspec.yaml @@ -35,7 +35,7 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - hmssdk_flutter: 1.7.2 + hmssdk_flutter: 1.10.2 permission_handler: 10.2.0 dev_dependencies: diff --git a/sample apps/getx/android/app/build.gradle b/sample apps/getx/android/app/build.gradle index 79e9e9558..944b2189c 100644 --- a/sample apps/getx/android/app/build.gradle +++ b/sample apps/getx/android/app/build.gradle @@ -26,7 +26,8 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + namespace "com.example.demo_with_getx_and_100ms" + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -45,9 +46,9 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.demo_with_getx_and_100ms" minSdkVersion 21 - targetSdkVersion 33 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName + targetSdkVersion 34 + versionCode 1 + versionName "1.0.0" } buildTypes { diff --git a/sample apps/getx/android/app/src/main/AndroidManifest.xml b/sample apps/getx/android/app/src/main/AndroidManifest.xml index f5b8febb2..0a60c0be4 100644 --- a/sample apps/getx/android/app/src/main/AndroidManifest.xml +++ b/sample apps/getx/android/app/src/main/AndroidManifest.xml @@ -15,6 +15,12 @@ + + + + + + ? availableAudioDevice}) { // Checkout the docs about handling onAudioDeviceChanged updates in preview here: https://www.100ms.live/docs/flutter/v2/how--to-guides/set-up-video-conferencing/preview } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } } diff --git a/sample apps/getx/lib/controllers/RoomController.dart b/sample apps/getx/lib/controllers/RoomController.dart index 73654f269..c4bcca445 100644 --- a/sample apps/getx/lib/controllers/RoomController.dart +++ b/sample apps/getx/lib/controllers/RoomController.dart @@ -3,8 +3,6 @@ import 'package:demo_with_getx_and_100ms/views/HomePage.dart'; import 'package:get/get.dart'; import 'package:hmssdk_flutter/hmssdk_flutter.dart'; -import '../services/RoomService.dart'; - class RoomController extends GetxController implements HMSUpdateListener, HMSActionResultListener { RxList> peerTrackList = >[].obs; @@ -21,7 +19,7 @@ class RoomController extends GetxController @override void onInit() async { hmsSdk.addUpdateListener(listener: this); - String? token = await RoomService().getToken(user: name, room: url); + var token = await hmsSdk.getAuthTokenByRoomCode(roomCode: url); if (token == null) return; @@ -148,6 +146,93 @@ class RoomController extends GetxController case HMSActionResultListenerMethod.stopScreenShare: Get.snackbar("stopScreenShare Error", hmsException.message ?? ""); + break; + case HMSActionResultListenerMethod.changeTrackState: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeMetadata: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.endRoom: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.removePeer: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.acceptChangeRole: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeRoleOfPeer: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeTrackStateForRole: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.startRtmpOrRecording: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.stopRtmpAndRecording: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeName: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendBroadcastMessage: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendGroupMessage: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendDirectMessage: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.hlsStreamingStarted: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.hlsStreamingStopped: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.startAudioShare: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.stopAudioShare: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.switchCamera: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeRoleOfPeersWithRoles: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.setSessionMetadataForKey: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendHLSTimedMetadata: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.lowerLocalPeerHand: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.lowerRemotePeerHand: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.raiseLocalPeerHand: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.quickStartPoll: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.addSingleChoicePollResponse: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.addMultiChoicePollResponse: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.unknown: + // TODO: Handle this case. + break; + case null: + // TODO: Handle this case. break; } Get.snackbar("Error", hmsException.message ?? ""); @@ -170,6 +255,93 @@ class RoomController extends GetxController case HMSActionResultListenerMethod.stopScreenShare: isScreenShareActive.toggle(); break; + case HMSActionResultListenerMethod.changeTrackState: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeMetadata: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.endRoom: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.removePeer: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.acceptChangeRole: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeRoleOfPeer: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeTrackStateForRole: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.startRtmpOrRecording: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.stopRtmpAndRecording: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeName: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendBroadcastMessage: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendGroupMessage: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendDirectMessage: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.hlsStreamingStarted: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.hlsStreamingStopped: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.startAudioShare: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.stopAudioShare: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.switchCamera: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.changeRoleOfPeersWithRoles: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.setSessionMetadataForKey: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.sendHLSTimedMetadata: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.lowerLocalPeerHand: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.lowerRemotePeerHand: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.raiseLocalPeerHand: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.quickStartPoll: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.addSingleChoicePollResponse: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.addMultiChoicePollResponse: + // TODO: Handle this case. + break; + case HMSActionResultListenerMethod.unknown: + // TODO: Handle this case. + break; + case null: + // TODO: Handle this case. + break; } } @@ -226,4 +398,16 @@ class RoomController extends GetxController void onUpdateSpeakers({required List updateSpeakers}) { // Checkout the docs for handling the updates regarding who is currently speaking here: https://www.100ms.live/docs/flutter/v2/how--to-guides/set-up-video-conferencing/render-video/show-audio-level } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } + + @override + void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { + // TODO: implement onSessionStoreAvailable + } } diff --git a/sample apps/getx/lib/services/Constants.dart b/sample apps/getx/lib/services/Constants.dart deleted file mode 100644 index 62ba9056c..000000000 --- a/sample apps/getx/lib/services/Constants.dart +++ /dev/null @@ -1,7 +0,0 @@ -class Constant { - static String tokenEndpoint = "https://prod-in.100ms.live/hmsapi/get-token"; - - static String meetingUrl = ""; - static String meetingCode = ""; - static String rtmpUrl = ""; -} diff --git a/sample apps/getx/lib/services/RoomService.dart b/sample apps/getx/lib/services/RoomService.dart deleted file mode 100644 index 880c89c1d..000000000 --- a/sample apps/getx/lib/services/RoomService.dart +++ /dev/null @@ -1,58 +0,0 @@ -import 'dart:convert'; -import 'constants.dart'; -import 'package:http/http.dart' as http; - -class RoomService { - //This function gets the token from the meeting URL - Future getToken({required String user, required String room}) async { - Constant.meetingUrl = room; - - //codeAndDomain stores the subDomain & code - List codeAndDomain = getCode(room) ?? []; - if (codeAndDomain.isEmpty) { - return null; - } - - /** - * Let's understand the subdomain and code from the sample URL - * In this url: http://100ms-rocks.app.100ms.live/meeting/abc-def-ghi - * - * subdomain is 100ms-rocks - * code is abc-def-ghi - */ - Constant.meetingCode = codeAndDomain[1] ?? ''; - Uri endPoint = Uri.parse(Constant.tokenEndpoint); - http.Response response = await http.post(endPoint, body: { - 'code': (codeAndDomain[1] ?? "").trim(), - 'user_id': user, - }, headers: { - 'subdomain': (codeAndDomain[0] ?? "").trim() - }); - - //This is the response returned from above HTTP call - var body = json.decode(response.body); - return body['token']; - } - -//This function returns the subDomain and code from the URL we provided to join the room - List? getCode(String roomUrl) { - String url = roomUrl; - if (url == "") return []; - url = url.trim(); - - List codeAndDomain = []; - String code = ""; - String subDomain = ""; - codeAndDomain = url.split(".app.100ms.live"); - code = codeAndDomain[1]; - subDomain = codeAndDomain[0] - .split(roomUrl.contains("https") ? "https://" : "http://")[1] + - (".app.100ms.live"); - if (code.contains("meeting")) { - code = code.split("/meeting/")[1]; - } else { - code = code.split("/preview/")[1]; - } - return [subDomain, code]; - } -} diff --git a/sample apps/getx/lib/views/HomePage.dart b/sample apps/getx/lib/views/HomePage.dart index 60b58955f..a272b013d 100644 --- a/sample apps/getx/lib/views/HomePage.dart +++ b/sample apps/getx/lib/views/HomePage.dart @@ -11,8 +11,7 @@ class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { - final meetingTextController = TextEditingController( - text: "https://yogi-live.app.100ms.live/streaming/meeting/qii-tow-sjq"); + final roomCode = TextEditingController(text: "zhr-seow-tuj"); final nameTextController = TextEditingController(); return SafeArea( @@ -34,13 +33,13 @@ class HomePage extends StatelessWidget { SizedBox( width: 300.0, child: TextField( - controller: meetingTextController, + controller: roomCode, autofocus: true, keyboardType: TextInputType.url, decoration: InputDecoration( hintText: 'Enter Room URL', suffixIcon: IconButton( - onPressed: meetingTextController.clear, + onPressed: roomCode.clear, icon: const Icon(Icons.clear), ), border: const OutlineInputBorder( @@ -78,16 +77,16 @@ class HomePage extends StatelessWidget { borderRadius: BorderRadius.circular(16.0), ))), onPressed: () async { - if (!(GetUtils.isBlank(meetingTextController.text) ?? true) && + if (!(GetUtils.isBlank(roomCode.text) ?? true) && !(GetUtils.isBlank(nameTextController.text) ?? true)) { if (kDebugMode) { print( - "RaisedButton ${meetingTextController.text} ${nameTextController.text}"); + "RaisedButton ${roomCode.text} ${nameTextController.text}"); } bool res = await getPermissions(); if (res) { Get.to(() => PreviewWidget( - meetingTextController.text, nameTextController.text)); + roomCode.text, nameTextController.text)); } } }, diff --git a/sample apps/getx/lib/views/PreviewWidget.dart b/sample apps/getx/lib/views/PreviewWidget.dart index 81ff25e45..88c907a13 100644 --- a/sample apps/getx/lib/views/PreviewWidget.dart +++ b/sample apps/getx/lib/views/PreviewWidget.dart @@ -6,8 +6,8 @@ import 'package:get/get.dart'; import 'RoomWidget.dart'; class PreviewWidget extends StatelessWidget { - String meetingUrl; - String userName; + final String meetingUrl; + final String userName; late PreviewController previewController; diff --git a/sample apps/getx/lib/views/VideoWidget.dart b/sample apps/getx/lib/views/VideoWidget.dart index 9d576ca0e..9786efc72 100644 --- a/sample apps/getx/lib/views/VideoWidget.dart +++ b/sample apps/getx/lib/views/VideoWidget.dart @@ -20,9 +20,11 @@ class VideoWidget extends StatelessWidget { }); }, onFocusLost: () { - roomController.peerTrackList[index].update((val) { - val?.isOffScreen = true; - }); + if (roomController.peerTrackList.length > index) { + roomController.peerTrackList[index].update((val) { + val?.isOffScreen = true; + }); + } }, child: Obx(() { var user = roomController.peerTrackList[index]; diff --git a/sample apps/getx/pubspec.lock b/sample apps/getx/pubspec.lock index f362cecd1..1bc474991 100644 --- a/sample apps/getx/pubspec.lock +++ b/sample apps/getx/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.17.2" cupertino_icons: dependency: "direct main" description: @@ -103,10 +103,10 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: "1323678b739bb0768adea396d618eed839c3c2c15eb135166988a06a92562baa" + sha256: b3f1438c5146afe0399935d78820357bf548b0e3ea36f9355878670ccc2aca6e url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.10.2" http: dependency: "direct main" description: @@ -151,10 +151,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" path: dependency: transitive description: @@ -167,42 +167,42 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8" + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "11.0.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "11.1.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: ee96ac32f5a8e6f80756e25b25b9f8e535816c8e6665a96b6d70681f8c4f7e85 + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" url: "https://pub.dev" source: hosted - version: "9.0.8" + version: "9.1.4" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.12.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 url: "https://pub.dev" source: hosted - version: "0.1.2" + version: "0.1.3" plugin_platform_interface: dependency: transitive description: @@ -228,18 +228,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" string_scanner: dependency: transitive description: @@ -260,10 +260,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.6.0" typed_data: dependency: transitive description: @@ -292,10 +292,10 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.1.4-beta" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" - flutter: ">=2.8.0" + dart: ">=3.1.0-185.0.dev <4.0.0" + flutter: ">=2.10.0" diff --git a/sample apps/getx/pubspec.yaml b/sample apps/getx/pubspec.yaml index 2577d81d5..1dbf8eaca 100644 --- a/sample apps/getx/pubspec.yaml +++ b/sample apps/getx/pubspec.yaml @@ -32,11 +32,11 @@ dependencies: sdk: flutter - hmssdk_flutter: 1.3.2 + hmssdk_flutter: 1.10.2 cupertino_icons: 1.0.5 get: 4.6.5 - permission_handler: 10.2.0 + permission_handler: ^11.0.0 focus_detector: 2.0.1 http: 0.13.5 diff --git a/sample apps/hms-callkit-app/lib/hmssdk/meeting_page.dart b/sample apps/hms-callkit-app/lib/hmssdk/meeting_page.dart index 177bde65e..d47a791cf 100644 --- a/sample apps/hms-callkit-app/lib/hmssdk/meeting_page.dart +++ b/sample apps/hms-callkit-app/lib/hmssdk/meeting_page.dart @@ -384,4 +384,11 @@ class _MeetingPageState extends State void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { // TODO: implement onSessionStoreAvailable } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } } diff --git a/sample apps/hms-callkit-app/lib/hmssdk/preview_page.dart b/sample apps/hms-callkit-app/lib/hmssdk/preview_page.dart index 61cb98fa2..cc2f861eb 100644 --- a/sample apps/hms-callkit-app/lib/hmssdk/preview_page.dart +++ b/sample apps/hms-callkit-app/lib/hmssdk/preview_page.dart @@ -263,4 +263,11 @@ class _PreviewPageState extends State NavigationService.instance.pushNamedIfNotCurrent(AppRoute.homePage); } } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } } diff --git a/sample apps/hms-callkit-app/pubspec.yaml b/sample apps/hms-callkit-app/pubspec.yaml index cb6576545..3c778c5ff 100644 --- a/sample apps/hms-callkit-app/pubspec.yaml +++ b/sample apps/hms-callkit-app/pubspec.yaml @@ -39,7 +39,7 @@ dependencies: firebase_messaging_platform_interface: 4.5.1 uuid: 3.0.6 http: 0.13.4 - hmssdk_flutter: 1.6.0 + hmssdk_flutter: 1.10.2 permission_handler: 10.2.0 flutter_callkit_incoming: 2.0.0 cloud_functions: 4.3.1 diff --git a/sample apps/mobx/android/app/build.gradle b/sample apps/mobx/android/app/build.gradle index 36c5bfebf..8e3860d2b 100644 --- a/sample apps/mobx/android/app/build.gradle +++ b/sample apps/mobx/android/app/build.gradle @@ -26,7 +26,8 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 33 + namespace "com.example.mobx" + compileSdkVersion 34 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -45,7 +46,7 @@ android { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.mobx" minSdkVersion 21 - targetSdkVersion 30 + targetSdkVersion 34 versionCode flutterVersionCode.toInteger() versionName flutterVersionName } diff --git a/sample apps/mobx/android/app/src/debug/AndroidManifest.xml b/sample apps/mobx/android/app/src/debug/AndroidManifest.xml index 066245a60..f880684a6 100644 --- a/sample apps/mobx/android/app/src/debug/AndroidManifest.xml +++ b/sample apps/mobx/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,4 @@ - + diff --git a/sample apps/mobx/android/app/src/main/AndroidManifest.xml b/sample apps/mobx/android/app/src/main/AndroidManifest.xml index 90bd84b3b..a5d33275a 100644 --- a/sample apps/mobx/android/app/src/main/AndroidManifest.xml +++ b/sample apps/mobx/android/app/src/main/AndroidManifest.xml @@ -1,11 +1,38 @@ - - - + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + messages; late HMSSDK hmsSDK; - HMSSDKInteractor() { + HMSSDKInteractor({required HMSSDK hmsSDK}) { //To know more about HMSSDK setup and initialization checkout the docs here: https://www.100ms.live/docs/flutter/v2/how--to-guides/install-the-sdk/hmssdk - initHMSSDK(); + initHMSSDK(hmssdk: hmsSDK); } - void initHMSSDK() async { - hmsSDK = HMSSDK(); - await hmsSDK.build(); + void initHMSSDK({required HMSSDK hmssdk}) async { + hmsSDK = hmssdk; + } + + Future getAuthTokenFromRoomCode({required String roomCode}) async { + return await hmsSDK.getAuthTokenByRoomCode(roomCode: roomCode); } void join({required HMSConfig config}) async { diff --git a/sample apps/riverpod/lib/main.dart b/sample apps/riverpod/lib/main.dart index fb9679268..3c36afbb4 100644 --- a/sample apps/riverpod/lib/main.dart +++ b/sample apps/riverpod/lib/main.dart @@ -1,8 +1,11 @@ import 'dart:io'; +import 'package:example_riverpod/hms_sdk_interactor.dart'; import 'package:example_riverpod/preview/preview_screen.dart'; +import 'package:example_riverpod/preview/preview_store.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:hmssdk_flutter/hmssdk_flutter.dart'; import 'package:permission_handler/permission_handler.dart'; void main() { @@ -55,8 +58,8 @@ Future getPermissions() async { class _HomePageState extends State { TextEditingController nameTextController = TextEditingController(text: ""); - TextEditingController meetingTextController = TextEditingController( - text: "https://yogi-live.app.100ms.live/streaming/preview/qii-tow-sjq"); + TextEditingController roomCodeController = + TextEditingController(text: "zhr-seow-tuj"); @override Widget build(BuildContext context) { return SafeArea( @@ -78,13 +81,13 @@ class _HomePageState extends State { SizedBox( width: 300.0, child: TextField( - controller: meetingTextController, + controller: roomCodeController, autofocus: true, keyboardType: TextInputType.url, decoration: InputDecoration( hintText: 'Enter Room URL', suffixIcon: IconButton( - onPressed: meetingTextController.clear, + onPressed: roomCodeController.clear, icon: const Icon(Icons.clear), ), border: const OutlineInputBorder( @@ -122,16 +125,23 @@ class _HomePageState extends State { borderRadius: BorderRadius.circular(16.0), ))), onPressed: () async { - if (meetingTextController.text.isNotEmpty && + if (roomCodeController.text.isNotEmpty && nameTextController.text.isNotEmpty) { bool res = await getPermissions(); if (res) { + var hmssdk = HMSSDK(); + await hmssdk.build(); + var hmssdkInteractor = HMSSDKInteractor(hmsSDK: hmssdk); + var previewStore = + PreviewStore(hmssdkInteractor: hmssdkInteractor); + Navigator.push( context, MaterialPageRoute( builder: (context) => PreviewScreen( name: nameTextController.text, - roomLink: meetingTextController.text, + roomLink: roomCodeController.text, + previewStore: previewStore, )), ); } diff --git a/sample apps/riverpod/lib/meeting/meeting_store.dart b/sample apps/riverpod/lib/meeting/meeting_store.dart index 3da9aca61..f74e32082 100644 --- a/sample apps/riverpod/lib/meeting/meeting_store.dart +++ b/sample apps/riverpod/lib/meeting/meeting_store.dart @@ -2,7 +2,6 @@ import 'package:example_riverpod/hms_sdk_interactor.dart'; import 'package:example_riverpod/meeting/peer_track_node.dart'; -import 'package:example_riverpod/service/room_service.dart'; import 'package:flutter/material.dart'; //Project imports @@ -39,7 +38,8 @@ class MeetingStore extends ChangeNotifier // Function calls******************************************* Future join(String user, String roomUrl) async { - String? token = await RoomService().getToken(user: user, room: roomUrl); + var token = + await _hmsSDKInteractor.getAuthTokenFromRoomCode(roomCode: roomUrl); if (token == null) return false; HMSConfig config = HMSConfig(authToken: token, userName: user); @@ -270,6 +270,11 @@ class MeetingStore extends ChangeNotifier PeerTrackNode peerTrackNode = peerTracks[index]; peerTrackNode.audioTrack = track as HMSAudioTrack; peerTrackNode.notify(); + } else { + peerTracks.add(PeerTrackNode( + peer: peer, + uid: peer.peerId + "mainVideo", + audioTrack: track as HMSAudioTrack)); } return; } @@ -282,7 +287,10 @@ class MeetingStore extends ChangeNotifier peerTrackNode.track = track as HMSVideoTrack; peerTrackNode.notify(); } else { - return; + peerTracks.add(PeerTrackNode( + peer: peer, + uid: peer.peerId + "mainVideo", + track: track as HMSVideoTrack)); } } else { if (trackUpdate == HMSTrackUpdate.trackAdded) { @@ -369,6 +377,7 @@ class MeetingStore extends ChangeNotifier switch (methodType) { case HMSActionResultListenerMethod.leave: peerTracks.clear(); + _hmsSDKInteractor.removeUpdateListener(this); break; case HMSActionResultListenerMethod.switchCamera: break; @@ -399,4 +408,14 @@ class MeetingStore extends ChangeNotifier required HMSException hmsException}) { this.hmsException = hmsException; } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) {} + + @override + void onSessionStoreAvailable({HMSSessionStore? hmsSessionStore}) { + // TODO: implement onSessionStoreAvailable + } } diff --git a/sample apps/riverpod/lib/preview/preview_screen.dart b/sample apps/riverpod/lib/preview/preview_screen.dart index b587d63b8..572572a28 100644 --- a/sample apps/riverpod/lib/preview/preview_screen.dart +++ b/sample apps/riverpod/lib/preview/preview_screen.dart @@ -8,8 +8,13 @@ import 'package:hmssdk_flutter/hmssdk_flutter.dart'; class PreviewScreen extends ConsumerStatefulWidget { final String roomLink; final String name; + final PreviewStore previewStore; - const PreviewScreen({Key? key, required this.name, required this.roomLink}) + const PreviewScreen( + {Key? key, + required this.name, + required this.roomLink, + required this.previewStore}) : super(key: key); @override @@ -17,23 +22,20 @@ class PreviewScreen extends ConsumerStatefulWidget { } class _PreviewScreenState extends ConsumerState { - final previewStoreProvider = ChangeNotifierProvider((ref) { - return PreviewStore(); - }); + late final ChangeNotifierProvider previewStoreProvider; @override void initState() { super.initState(); + previewStoreProvider = ChangeNotifierProvider((ref) { + return widget.previewStore; + }); initPreview(); } - void initPreview() async { - bool ans = await ref - .read(previewStoreProvider) + Future initPreview() async { + await widget.previewStore .startPreview(user: widget.name, roomId: widget.roomLink); - if (ans == false) { - Navigator.of(context).pop(); - } } @override @@ -42,6 +44,7 @@ class _PreviewScreenState extends ConsumerState { final double itemHeight = size.height; final double itemWidth = size.width; final _previewStore = ref.watch(previewStoreProvider); + return WillPopScope( onWillPop: () async { _previewStore.removePreviewListener(); diff --git a/sample apps/riverpod/lib/preview/preview_store.dart b/sample apps/riverpod/lib/preview/preview_store.dart index b94dc7dd8..97c26c3c6 100644 --- a/sample apps/riverpod/lib/preview/preview_store.dart +++ b/sample apps/riverpod/lib/preview/preview_store.dart @@ -1,14 +1,13 @@ //Package imports import 'package:example_riverpod/hms_sdk_interactor.dart'; -import 'package:example_riverpod/service/room_service.dart'; import 'package:flutter/cupertino.dart'; import 'package:hmssdk_flutter/hmssdk_flutter.dart'; class PreviewStore extends ChangeNotifier implements HMSPreviewListener { late HMSSDKInteractor hmsSDKInteractor; - PreviewStore() { - hmsSDKInteractor = HMSSDKInteractor(); + PreviewStore({required HMSSDKInteractor hmssdkInteractor}) { + hmsSDKInteractor = hmssdkInteractor; } List localTracks = []; @@ -49,7 +48,8 @@ class PreviewStore extends ChangeNotifier implements HMSPreviewListener { Future startPreview( {required String user, required String roomId}) async { - String? token = await RoomService().getToken(user: user, room: roomId); + String? token = + await hmsSDKInteractor.getAuthTokenFromRoomCode(roomCode: roomId); if (token == null) return false; HMSConfig config = HMSConfig(authToken: token, userName: user); @@ -86,6 +86,14 @@ class PreviewStore extends ChangeNotifier implements HMSPreviewListener { } void leave() { + hmsSDKInteractor.removePreviewListener(this); hmsSDKInteractor.leave(); } + + @override + void onPeerListUpdate( + {required List addedPeers, + required List removedPeers}) { + // TODO: implement onPeerListUpdate + } } diff --git a/sample apps/riverpod/lib/service/room_service.dart b/sample apps/riverpod/lib/service/room_service.dart deleted file mode 100644 index 7cfe8565e..000000000 --- a/sample apps/riverpod/lib/service/room_service.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'dart:convert'; -import 'package:http/http.dart' as http; - -class RoomService { - //This function gets the token from the meeting URL - Future getToken({required String user, required String room}) async { - //codeAndDomain stores the subDomain & code - List codeAndDomain = getCode(room) ?? []; - if (codeAndDomain.isEmpty) { - return null; - } - - /** - * Let's understand the subdomain and code from the sample URL - * In this url: http://100ms-rocks.app.100ms.live/meeting/abc-def-ghi - * - * subdomain is 100ms-rocks - * code is abc-def-ghi - */ - Uri endPoint = Uri.parse("https://prod-in.100ms.live/hmsapi/get-token"); - http.Response response = await http.post(endPoint, body: { - 'code': (codeAndDomain[1] ?? "").trim(), - 'user_id': user, - }, headers: { - 'subdomain': (codeAndDomain[0] ?? "").trim() - }); - - //This is the response returned from above HTTP call - var body = json.decode(response.body); - return body['token']; - } - -//This function returns the subDomain and code from the URL we provided to join the room - List? getCode(String roomUrl) { - String url = roomUrl; - if (url == "") return []; - url = url.trim(); - - List codeAndDomain = []; - String code = ""; - String subDomain = ""; - codeAndDomain = url.split(".app.100ms.live"); - code = codeAndDomain[1]; - subDomain = codeAndDomain[0] - .split(roomUrl.contains("https") ? "https://" : "http://")[1] + - (".app.100ms.live"); - if (code.contains("meeting")) { - code = code.split("/meeting/")[1]; - } else { - code = code.split("/preview/")[1]; - } - return [subDomain, code]; - } -} diff --git a/sample apps/riverpod/pubspec.lock b/sample apps/riverpod/pubspec.lock index 7b8d8be33..45ebaede5 100644 --- a/sample apps/riverpod/pubspec.lock +++ b/sample apps/riverpod/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.17.2" cupertino_icons: dependency: "direct main" description: @@ -87,10 +87,10 @@ packages: dependency: "direct main" description: name: hmssdk_flutter - sha256: "1323678b739bb0768adea396d618eed839c3c2c15eb135166988a06a92562baa" + sha256: b3f1438c5146afe0399935d78820357bf548b0e3ea36f9355878670ccc2aca6e url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.10.2" http: dependency: "direct main" description: @@ -135,10 +135,10 @@ packages: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.9.1" path: dependency: transitive description: @@ -151,42 +151,42 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "33c6a1253d1f95fd06fa74b65b7ba907ae9811f9d5c1d3150e51417d04b8d6a8" + sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "11.0.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "8028362b40c4a45298f1cbfccd227c8dd6caf0e27088a69f2ba2ab15464159e2" + sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e url: "https://pub.dev" source: hosted - version: "10.2.0" + version: "11.1.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163" + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" url: "https://pub.dev" source: hosted - version: "9.0.7" + version: "9.1.4" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "68abbc472002b5e6dfce47fe9898c6b7d8328d58b5d2524f75e277c07a97eb84" + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" url: "https://pub.dev" source: hosted - version: "3.9.0" + version: "3.12.0" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: f67cab14b4328574938ecea2db3475dad7af7ead6afab6338772c5f88963e38b + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 url: "https://pub.dev" source: hosted - version: "0.1.2" + version: "0.1.3" plugin_platform_interface: dependency: transitive description: @@ -220,10 +220,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.11.0" state_notifier: dependency: transitive description: @@ -236,10 +236,10 @@ packages: dependency: transitive description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" string_scanner: dependency: transitive description: @@ -260,10 +260,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.6.0" typed_data: dependency: transitive description: @@ -284,10 +284,10 @@ packages: dependency: transitive description: name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.1.4-beta" sdks: - dart: ">=3.2.0-194.0.dev <4.0.0" + dart: ">=3.1.0-185.0.dev <4.0.0" flutter: ">=3.0.0" diff --git a/sample apps/riverpod/pubspec.yaml b/sample apps/riverpod/pubspec.yaml index a7f6d5d81..1f7e4620a 100644 --- a/sample apps/riverpod/pubspec.yaml +++ b/sample apps/riverpod/pubspec.yaml @@ -30,11 +30,11 @@ dependencies: flutter: sdk: flutter - hmssdk_flutter: 1.3.2 + hmssdk_flutter: 1.10.2 cupertino_icons: - flutter_riverpod: 2.3.0 + flutter_riverpod: ^2.3.0 http: 0.13.5 - permission_handler: 10.2.0 + permission_handler: ^11.0.0 dev_dependencies: flutter_test: