diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..f686ab44 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,45 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "pod_player", + "request": "launch", + "type": "dart" + }, + { + "name": "pod_player (profile mode)", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "pod_player (release mode)", + "request": "launch", + "type": "dart", + "flutterMode": "release" + }, + { + "name": "example", + "cwd": "example", + "request": "launch", + "type": "dart" + }, + { + "name": "example (profile mode)", + "cwd": "example", + "request": "launch", + "type": "dart", + "flutterMode": "profile" + }, + { + "name": "example (release mode)", + "cwd": "example", + "request": "launch", + "type": "dart", + "flutterMode": "release" + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 4dd4015c..071659be 100644 --- a/README.md +++ b/README.md @@ -219,7 +219,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromNetwork extends StatefulWidget { - const PlayVideoFromNetwork({Key? key}) : super(key: key); + const PlayVideoFromNetwork({super.key}); @override State createState() => _PlayVideoFromNetworkState(); @@ -308,7 +308,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromYoutube extends StatefulWidget { - const PlayVideoFromYoutube({Key? key}) : super(key: key); + const PlayVideoFromYoutube({super.key}); @override State createState() => _PlayVideoFromYoutubeState(); @@ -350,7 +350,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromVimeo extends StatefulWidget { - const PlayVideoFromVimeo({Key? key}) : super(key: key); + const PlayVideoFromVimeo({super.key}); @override State createState() => _PlayVideoFromVimeoState(); @@ -392,7 +392,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromVimeo extends StatefulWidget { - const PlayVideoFromVimeo({Key? key}) : super(key: key); + const PlayVideoFromVimeo({super.key}); @override State createState() => _PlayVideoFromVimeoState(); @@ -434,7 +434,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromVimeoPrivateVideo extends StatefulWidget { - const PlayVideoFromVimeoPrivateVideo({Key? key}) : super(key: key); + const PlayVideoFromVimeoPrivateVideo({super.key}); @override State createState() => diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist index 9625e105..7c569640 100644 --- a/example/ios/Flutter/AppFrameworkInfo.plist +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/example/ios/Podfile b/example/ios/Podfile index 88359b22..279576f3 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +# platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 2d8232cd..03fbbd21 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -4,13 +4,14 @@ PODS: - Flutter - video_player_avfoundation (0.0.1): - Flutter + - FlutterMacOS - wakelock_plus (0.0.1): - Flutter DEPENDENCIES: - Flutter (from `Flutter`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`) + - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`) - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) EXTERNAL SOURCES: @@ -19,16 +20,16 @@ EXTERNAL SOURCES: package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" video_player_avfoundation: - :path: ".symlinks/plugins/video_player_avfoundation/ios" + :path: ".symlinks/plugins/video_player_avfoundation/darwin" wakelock_plus: :path: ".symlinks/plugins/wakelock_plus/ios" SPEC CHECKSUMS: - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - package_info_plus: fd030dabf36271f146f1f3beacd48f564b0f17f7 - video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 + video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1 wakelock_plus: 8b09852c8876491e4b6d179e17dfe2a0b5f60d47 -PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3 +PODFILE CHECKSUM: c4c93c5f6502fe2754f48404d3594bf779584011 -COCOAPODS: 1.11.2 +COCOAPODS: 1.15.2 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 5b1c9f9c..8b6b52ed 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -155,7 +155,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -342,7 +342,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 +420,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 +469,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/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a3..a6b826db 100644 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ args) { } class VimeoApp extends StatelessWidget { - const VimeoApp({Key? key}) : super(key: key); + const VimeoApp({super.key}); @override Widget build(BuildContext context) { @@ -20,7 +20,7 @@ class VimeoApp extends StatelessWidget { } class VimeoVideoViewer extends StatefulWidget { - const VimeoVideoViewer({Key? key}) : super(key: key); + const VimeoVideoViewer({super.key}); @override State createState() => VimeoVideoViewerState(); diff --git a/example/lib/examples/load_youtube_from_urls.dart b/example/lib/examples/load_youtube_from_urls.dart index 013840a6..a74cf973 100644 --- a/example/lib/examples/load_youtube_from_urls.dart +++ b/example/lib/examples/load_youtube_from_urls.dart @@ -6,7 +6,7 @@ void main(List args) { } class YoutubeApp extends StatelessWidget { - const YoutubeApp({Key? key}) : super(key: key); + const YoutubeApp({super.key}); @override Widget build(BuildContext context) { @@ -21,7 +21,7 @@ class YoutubeApp extends StatelessWidget { } class YoutubeVideoViewer extends StatefulWidget { - const YoutubeVideoViewer({Key? key}) : super(key: key); + const YoutubeVideoViewer({super.key}); @override State createState() => _YoutubeVideoViewerState(); diff --git a/example/lib/examples/play_list_of_videos.dart b/example/lib/examples/play_list_of_videos.dart index ed695d34..8c21809d 100644 --- a/example/lib/examples/play_list_of_videos.dart +++ b/example/lib/examples/play_list_of_videos.dart @@ -7,7 +7,7 @@ void main(List args) { } class ListOfVideosApp extends StatelessWidget { - const ListOfVideosApp({Key? key}) : super(key: key); + const ListOfVideosApp({super.key}); @override Widget build(BuildContext context) { @@ -82,8 +82,7 @@ class ListOfVideosApp extends StatelessWidget { class ListOfVideosScreen extends StatelessWidget { final List videosList; - const ListOfVideosScreen({Key? key, required this.videosList}) - : super(key: key); + const ListOfVideosScreen({super.key, required this.videosList}); @override Widget build(BuildContext context) { @@ -100,8 +99,7 @@ class ListOfVideosScreen extends StatelessWidget { class ListOfVideosViewer extends StatefulWidget { final List videosList; - const ListOfVideosViewer({Key? key, required this.videosList}) - : super(key: key); + const ListOfVideosViewer({super.key, required this.videosList}); @override State createState() => _ListOfVideosViewerState(); diff --git a/example/lib/examples/play_videos_list_dynamically.dart b/example/lib/examples/play_videos_list_dynamically.dart index 635037a1..3229e928 100644 --- a/example/lib/examples/play_videos_list_dynamically.dart +++ b/example/lib/examples/play_videos_list_dynamically.dart @@ -9,7 +9,7 @@ void main(List args) { } class ListOfVideosApp extends StatelessWidget { - const ListOfVideosApp({Key? key}) : super(key: key); + const ListOfVideosApp({super.key}); @override Widget build(BuildContext context) { @@ -50,8 +50,7 @@ class ListOfVideosApp extends StatelessWidget { class ListOfVideosScreen extends StatelessWidget { final List controllers; - const ListOfVideosScreen({Key? key, required this.controllers}) - : super(key: key); + const ListOfVideosScreen({super.key, required this.controllers}); @override Widget build(BuildContext context) { @@ -76,10 +75,10 @@ class VideoViewer extends StatefulWidget { final List controllers; const VideoViewer({ - Key? key, + super.key, required this.controller, required this.controllers, - }) : super(key: key); + }); @override State createState() => VideoViewerState(); diff --git a/example/lib/main.dart b/example/lib/main.dart index ffe73f8e..9a890024 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -15,7 +15,7 @@ void main() { } class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); @override Widget build(BuildContext context) { @@ -37,7 +37,7 @@ class MyApp extends StatelessWidget { } class MainPage extends StatefulWidget { - const MainPage({Key? key}) : super(key: key); + const MainPage({super.key}); @override State createState() => _MainPageState(); diff --git a/example/lib/screens/cutom_video_controllers.dart b/example/lib/screens/cutom_video_controllers.dart index ce511edb..5435b08b 100644 --- a/example/lib/screens/cutom_video_controllers.dart +++ b/example/lib/screens/cutom_video_controllers.dart @@ -5,7 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class CustomVideoControlls extends StatefulWidget { - const CustomVideoControlls({Key? key}) : super(key: key); + const CustomVideoControlls({super.key}); @override State createState() => _CustomVideoControllsState(); diff --git a/example/lib/screens/from_asset.dart b/example/lib/screens/from_asset.dart index 1a63f055..3dfbacea 100644 --- a/example/lib/screens/from_asset.dart +++ b/example/lib/screens/from_asset.dart @@ -2,7 +2,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromAsset extends StatefulWidget { - const PlayVideoFromAsset({Key? key}) : super(key: key); + const PlayVideoFromAsset({super.key}); @override State createState() => _PlayVideoFromAssetState(); diff --git a/example/lib/screens/from_network.dart b/example/lib/screens/from_network.dart index dd5739a7..40d28bc7 100644 --- a/example/lib/screens/from_network.dart +++ b/example/lib/screens/from_network.dart @@ -3,7 +3,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class PlayVideoFromNetwork extends StatefulWidget { - const PlayVideoFromNetwork({Key? key}) : super(key: key); + const PlayVideoFromNetwork({super.key}); @override State createState() => _PlayVideoFromAssetState(); diff --git a/example/lib/screens/from_network_urls.dart b/example/lib/screens/from_network_urls.dart index 3c0ab641..ede5f0fe 100644 --- a/example/lib/screens/from_network_urls.dart +++ b/example/lib/screens/from_network_urls.dart @@ -3,7 +3,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; class PlayVideoFromNetworkQualityUrls extends StatefulWidget { - const PlayVideoFromNetworkQualityUrls({Key? key}) : super(key: key); + const PlayVideoFromNetworkQualityUrls({super.key}); @override State createState() => diff --git a/example/lib/screens/from_vimeo_id.dart b/example/lib/screens/from_vimeo_id.dart index 93a67efb..0beef4e0 100644 --- a/example/lib/screens/from_vimeo_id.dart +++ b/example/lib/screens/from_vimeo_id.dart @@ -2,7 +2,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromVimeoId extends StatefulWidget { - const PlayVideoFromVimeoId({Key? key}) : super(key: key); + const PlayVideoFromVimeoId({super.key}); @override State createState() => _PlayVideoFromVimeoIdState(); diff --git a/example/lib/screens/from_vimeo_private_id.dart b/example/lib/screens/from_vimeo_private_id.dart index da1baec0..c417d9c7 100644 --- a/example/lib/screens/from_vimeo_private_id.dart +++ b/example/lib/screens/from_vimeo_private_id.dart @@ -2,7 +2,7 @@ import 'package:pod_player/pod_player.dart'; import 'package:flutter/material.dart'; class PlayVideoFromVimeoPrivateId extends StatefulWidget { - const PlayVideoFromVimeoPrivateId({Key? key}) : super(key: key); + const PlayVideoFromVimeoPrivateId({super.key}); @override State createState() => diff --git a/example/lib/screens/from_youtube.dart b/example/lib/screens/from_youtube.dart index 8c10ec69..016e1f63 100644 --- a/example/lib/screens/from_youtube.dart +++ b/example/lib/screens/from_youtube.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:pod_player/pod_player.dart'; class PlayVideoFromYoutube extends StatefulWidget { - const PlayVideoFromYoutube({Key? key}) : super(key: key); + const PlayVideoFromYoutube({super.key}); @override State createState() => _PlayVideoFromVimeoIdState(); diff --git a/example/macos/Flutter/GeneratedPluginRegistrant.swift b/example/macos/Flutter/GeneratedPluginRegistrant.swift index f26940ad..8e40e9f0 100644 --- a/example/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,9 +6,11 @@ import FlutterMacOS import Foundation import package_info_plus +import video_player_avfoundation import wakelock_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { - FLTPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FLTPackageInfoPlusPlugin")) + FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) } diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 687fec49..44c90d0d 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: "none" version: 1.0.0+1 environment: - sdk: ">=2.16.1 <3.0.0" + sdk: ">=3.2.4 <4.0.0" dependencies: flutter: @@ -15,14 +15,14 @@ dependencies: pod_player: path: ../ - cupertino_icons: ^1.0.5 - visibility_detector: ^0.3.3 + cupertino_icons: ^1.0.6 + visibility_detector: ^0.4.0+2 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.1 + flutter_lints: ^3.0.1 flutter: uses-material-design: true diff --git a/lib/src/controllers/pod_getx_video_controller.dart b/lib/src/controllers/pod_getx_video_controller.dart index 7a46d30d..6a3ec5a9 100644 --- a/lib/src/controllers/pod_getx_video_controller.dart +++ b/lib/src/controllers/pod_getx_video_controller.dart @@ -19,6 +19,8 @@ part 'pod_video_controller.dart'; part 'pod_video_quality_controller.dart'; class PodGetXVideoController extends _PodGesturesController { + + ///main videoplayer controller VideoPlayerController? get videoCtr => _videoCtr; @@ -93,7 +95,6 @@ class PodGetXVideoController extends _PodGesturesController { httpHeaders: playVideoFrom.httpHeaders, ); playingVideoUrl = playVideoFrom.dataSource; - break; case PodVideoPlayerType.networkQualityUrls: final url = await getUrlFromVideoQualityUrls( qualityList: podPlayerConfig.videoQualityPriority, @@ -110,7 +111,6 @@ class PodGetXVideoController extends _PodGesturesController { ); playingVideoUrl = url; - break; case PodVideoPlayerType.youtube: final urls = await getVideoQualityUrlsFromYoutube( playVideoFrom.dataSource!, @@ -131,7 +131,6 @@ class PodGetXVideoController extends _PodGesturesController { ); playingVideoUrl = url; - break; case PodVideoPlayerType.vimeo: await getQualityUrlsFromVimeoId( playVideoFrom.dataSource!, @@ -151,7 +150,6 @@ class PodGetXVideoController extends _PodGesturesController { ); playingVideoUrl = url; - break; case PodVideoPlayerType.asset: /// @@ -163,7 +161,6 @@ class PodGetXVideoController extends _PodGesturesController { ); playingVideoUrl = playVideoFrom.dataSource; - break; case PodVideoPlayerType.file: if (kIsWeb) { throw Exception('file doesnt support web'); @@ -176,7 +173,6 @@ class PodGetXVideoController extends _PodGesturesController { videoPlayerOptions: playVideoFrom.videoPlayerOptions, ); - break; case PodVideoPlayerType.vimeoPrivateVideos: await getQualityUrlsFromVimeoPrivateId( playVideoFrom.dataSource!, @@ -195,8 +191,6 @@ class PodGetXVideoController extends _PodGesturesController { httpHeaders: playVideoFrom.httpHeaders, ); playingVideoUrl = url; - - break; } } @@ -248,7 +242,7 @@ class PodGetXVideoController extends _PodGesturesController { } } else { uni_html.document.documentElement?.requestFullscreen(); - enableFullScreen(tag); + enableFullScreen(tag, context); } } @@ -259,18 +253,14 @@ class PodGetXVideoController extends _PodGesturesController { case PodVideoState.playing: if (podPlayerConfig.wakelockEnabled) WakelockPlus.enable(); playVideo(true); - break; case PodVideoState.paused: if (podPlayerConfig.wakelockEnabled) WakelockPlus.disable(); playVideo(false); - break; case PodVideoState.loading: isShowOverlay(true); - break; case PodVideoState.error: if (podPlayerConfig.wakelockEnabled) WakelockPlus.disable(); playVideo(false); - break; } } diff --git a/lib/src/controllers/pod_player_controller.dart b/lib/src/controllers/pod_player_controller.dart index 229ce884..57558776 100644 --- a/lib/src/controllers/pod_player_controller.dart +++ b/lib/src/controllers/pod_player_controller.dart @@ -108,6 +108,10 @@ class PodPlayerController { PodVideoPlayerType get videoPlayerType => _ctr.videoPlayerType; + int? get vimeoPlayingVideoQuality => _ctr.vimeoPlayingVideoQuality; + + String get currentPaybackSpeed => _ctr.currentPaybackSpeed; + // Future initialize() async => _ctr.videoCtr?.initialize; //! video positions @@ -140,6 +144,15 @@ class PodPlayerController { ); } + /// change video quality + void changeQualityVideo(int quality) { + _ctr.changeVideoQuality(quality); + } + + void setPlaybackSpeed(String speed) { + _ctr.setVideoPlayBack(speed); + } + /// Remove registered listeners void removeListener(VoidCallback listener) { _checkAndWaitTillInitialized().then( @@ -160,6 +173,21 @@ class PodPlayerController { _ctr.isMute ? await _ctr.unMute() : await _ctr.mute(); } + /// toggle looping + Future toggleLooping() { + return _ctr.toggleLooping(); + } + + /// enable looping + Future enableLooping() { + return _ctr.setLooping(true); + } + + /// disable looping + Future disableLooping() { + return _ctr.setLooping(false); + } + ///Dispose pod video player controller void dispose() { _isCtrInitialised = false; @@ -227,16 +255,16 @@ class PodPlayerController { /// /// If onToggleFullScreen is set, you must handle the device /// orientation by yourself. - void enableFullScreen() { + void enableFullScreen({BuildContext? context}) { uni_html.document.documentElement?.requestFullscreen(); - _ctr.enableFullScreen(getTag); + _ctr.enableFullScreen(getTag, context); } /// Disables fullscreen mode. /// /// If onToggleFullScreen is set, you must handle the device /// orientation by yourself. - void disableFullScreen(BuildContext context) { + void disableFullScreen(BuildContext? context) { uni_html.document.exitFullscreen(); if (!_ctr.isWebPopupOverlayOpen) { diff --git a/lib/src/controllers/pod_video_controller.dart b/lib/src/controllers/pod_video_controller.dart index 0a0d4ea6..95c9dd15 100644 --- a/lib/src/controllers/pod_video_controller.dart +++ b/lib/src/controllers/pod_video_controller.dart @@ -159,7 +159,10 @@ class _PodVideoController extends _PodUiController { update(['update-all']); } - Future enableFullScreen(String tag) async { + Future enableFullScreen( + String tag, + BuildContext? context, + ) async { podLog('-full-screen-enable-entred'); if (!isFullScreen) { if (onToggleFullScreen != null) { @@ -176,7 +179,7 @@ class _PodVideoController extends _PodUiController { ]); } - _enableFullScreenView(tag); + _enableFullScreenView(tag, context ?? fullScreenContext); isFullScreen = true; WidgetsBinding.instance.addPostFrameCallback((timeStamp) { update(['full-screen']); @@ -186,7 +189,7 @@ class _PodVideoController extends _PodUiController { } Future disableFullScreen( - BuildContext context, + BuildContext? context, String tag, { bool enablePop = true, }) async { @@ -195,19 +198,21 @@ class _PodVideoController extends _PodUiController { if (onToggleFullScreen != null) { await onToggleFullScreen!(false); } else { - await Future.wait([ - SystemChrome.setPreferredOrientations([ - DeviceOrientation.portraitUp, - DeviceOrientation.portraitDown, - ]), - if (!(defaultTargetPlatform == TargetPlatform.iOS)) ...[ - SystemChrome.setPreferredOrientations(DeviceOrientation.values), - SystemChrome.setEnabledSystemUIMode( - SystemUiMode.manual, - overlays: SystemUiOverlay.values, - ), - ] - ]); + await Future.wait( + [ + SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + DeviceOrientation.portraitDown, + ]), + if (!(defaultTargetPlatform == TargetPlatform.iOS)) ...[ + SystemChrome.setPreferredOrientations(DeviceOrientation.values), + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.manual, + overlays: SystemUiOverlay.values, + ), + ], + ], + ); } if (enablePop) _exitFullScreenView(context, tag); @@ -217,21 +222,26 @@ class _PodVideoController extends _PodUiController { } } - void _exitFullScreenView(BuildContext context, String tag) { + void _exitFullScreenView(BuildContext? context, String tag) { podLog('popped-full-screen'); - Navigator.of(fullScreenContext).pop(); + if (Navigator.of(fullScreenContext).canPop()) { + Navigator.of(fullScreenContext).pop(); + } } - void _enableFullScreenView(String tag) { + void _enableFullScreenView( + String tag, + BuildContext? context, + ) { if (!isFullScreen) { podLog('full-screen-enabled'); - Navigator.push( - mainContext, + context ?? fullScreenContext, PageRouteBuilder( fullscreenDialog: true, pageBuilder: (BuildContext context, _, __) => FullScreenView( tag: tag, + fullScreenContext: context, ), reverseTransitionDuration: const Duration(milliseconds: 400), transitionsBuilder: (context, animation, secondaryAnimation, child) => diff --git a/lib/src/pod_player.dart b/lib/src/pod_player.dart index 82f451f8..4694c0be 100644 --- a/lib/src/pod_player.dart +++ b/lib/src/pod_player.dart @@ -44,6 +44,7 @@ class PodVideoPlayer extends StatefulWidget { final Widget? videoTitle; final Color? backgroundColor; final DecorationImage? videoThumbnail; + final ValueGetter? fullScreenContext; /// Optional callback, fired when full screen mode toggles. /// @@ -72,6 +73,7 @@ class PodVideoPlayer extends StatefulWidget { this.videoThumbnail, this.onToggleFullScreen, this.onLoading, + this.fullScreenContext, }) { addToUiController(); } @@ -256,6 +258,7 @@ class _PodVideoPlayerState extends State videoPlayerCtr: podCtr.videoCtr!, videoAspectRatio: videoAspectRatio, tag: widget.controller.getTag, + fullScreenContext: widget.fullScreenContext?.call(), ); }, ); @@ -264,6 +267,7 @@ class _PodVideoPlayerState extends State videoPlayerCtr: _podCtr.videoCtr!, videoAspectRatio: videoAspectRatio, tag: widget.controller.getTag, + fullScreenContext: widget.fullScreenContext?.call(), ); } } diff --git a/lib/src/widgets/core/overlays/mobile_bottomsheet.dart b/lib/src/widgets/core/overlays/mobile_bottomsheet.dart index 5cf988e9..6e26e884 100644 --- a/lib/src/widgets/core/overlays/mobile_bottomsheet.dart +++ b/lib/src/widgets/core/overlays/mobile_bottomsheet.dart @@ -180,9 +180,11 @@ class _VideoPlaybackSelectorMob extends StatelessWidget { class _MobileOverlayBottomControlles extends StatelessWidget { final String tag; + final BuildContext? fullScreenContext; const _MobileOverlayBottomControlles({ required this.tag, + required this.fullScreenContext, }); @override @@ -232,9 +234,13 @@ class _MobileOverlayBottomControlles extends StatelessWidget { onPressed: () { if (podCtr.isOverlayVisible) { if (podCtr.isFullScreen) { - podCtr.disableFullScreen(context, tag); + podCtr.disableFullScreen( + context, + tag, + ); } else { - podCtr.enableFullScreen(tag); + podCtr.enableFullScreen( + tag, fullScreenContext ?? context); } } else { podCtr.toggleVideoOverlay(); diff --git a/lib/src/widgets/core/overlays/mobile_overlay.dart b/lib/src/widgets/core/overlays/mobile_overlay.dart index 1afe558d..853b9a53 100644 --- a/lib/src/widgets/core/overlays/mobile_overlay.dart +++ b/lib/src/widgets/core/overlays/mobile_overlay.dart @@ -2,9 +2,11 @@ part of 'package:pod_player/src/pod_player.dart'; class _MobileOverlay extends StatelessWidget { final String tag; + final BuildContext? fullScreenContext; const _MobileOverlay({ required this.tag, + required this.fullScreenContext, }); @override @@ -80,7 +82,10 @@ class _MobileOverlay extends StatelessWidget { ), Align( alignment: Alignment.bottomLeft, - child: _MobileOverlayBottomControlles(tag: tag), + child: _MobileOverlayBottomControlles( + tag: tag, + fullScreenContext: fullScreenContext, + ), ), ], ); diff --git a/lib/src/widgets/core/overlays/overlays.dart b/lib/src/widgets/core/overlays/overlays.dart index d634c609..f8062e28 100644 --- a/lib/src/widgets/core/overlays/overlays.dart +++ b/lib/src/widgets/core/overlays/overlays.dart @@ -2,9 +2,11 @@ part of 'package:pod_player/src/pod_player.dart'; class _VideoOverlays extends StatelessWidget { final String tag; + final BuildContext? fullScreenContext; const _VideoOverlays({ required this.tag, + required this.fullScreenContext, }); @override @@ -52,7 +54,7 @@ class _VideoOverlays extends StatelessWidget { child: Stack( fit: StackFit.passthrough, children: [ - if (!kIsWeb) _MobileOverlay(tag: tag), + if (!kIsWeb) _MobileOverlay(tag: tag, fullScreenContext: fullScreenContext,), if (kIsWeb) _WebOverlay(tag: tag), ], ), diff --git a/lib/src/widgets/core/overlays/web_dropdown_menu.dart b/lib/src/widgets/core/overlays/web_dropdown_menu.dart index 78965f89..783a8999 100644 --- a/lib/src/widgets/core/overlays/web_dropdown_menu.dart +++ b/lib/src/widgets/core/overlays/web_dropdown_menu.dart @@ -68,14 +68,11 @@ class _WebSettingsDropdownState extends State<_WebSettingsDropdown> { switch (settingsMenu) { case 'OUALITY': await _onVimeoQualitySelect(details, podCtr); - break; case 'SPEED': await _onPlaybackSpeedSelect(details, podCtr); - break; case 'LOOP': podCtr.isWebPopupOverlayOpen = false; await podCtr.toggleLooping(); - break; default: podCtr.isWebPopupOverlayOpen = false; } diff --git a/lib/src/widgets/core/overlays/web_overlay.dart b/lib/src/widgets/core/overlays/web_overlay.dart index 3371b2fc..049b175f 100644 --- a/lib/src/widgets/core/overlays/web_overlay.dart +++ b/lib/src/widgets/core/overlays/web_overlay.dart @@ -107,16 +107,12 @@ class _WebOverlayBottomControlles extends StatelessWidget { id: 'volume', builder: (podCtr) => MaterialIconButton( toolTipMesg: podCtr.isMute - ? podCtr.podPlayerLabels.unmute ?? - 'Unmute${kIsWeb ? ' (m)' : ''}' - : podCtr.podPlayerLabels.mute ?? - 'Mute${kIsWeb ? ' (m)' : ''}', + ? podCtr.podPlayerLabels.unmute ?? 'Unmute${kIsWeb ? ' (m)' : ''}' + : podCtr.podPlayerLabels.mute ?? 'Mute${kIsWeb ? ' (m)' : ''}', color: itemColor, onPressed: podCtr.toggleMute, child: Icon( - podCtr.isMute - ? Icons.volume_off_rounded - : Icons.volume_up_rounded, + podCtr.isMute ? Icons.volume_off_rounded : Icons.volume_up_rounded, ), ), ), @@ -167,9 +163,7 @@ class _WebOverlayBottomControlles extends StatelessWidget { color: itemColor, onPressed: () => _onFullScreenToggle(podCtr, context), child: Icon( - podCtr.isFullScreen - ? Icons.fullscreen_exit - : Icons.fullscreen, + podCtr.isFullScreen ? Icons.fullscreen_exit : Icons.fullscreen, ), ), ], @@ -200,10 +194,10 @@ class _WebOverlayBottomControlles extends StatelessWidget { } else { if (kIsWeb) { uni_html.document.documentElement?.requestFullscreen(); - podCtr.enableFullScreen(tag); + podCtr.enableFullScreen(tag, context); return; } else { - podCtr.enableFullScreen(tag); + podCtr.enableFullScreen(tag, context); } } } else { diff --git a/lib/src/widgets/core/pod_core_player.dart b/lib/src/widgets/core/pod_core_player.dart index 7a7a3e47..22d286ee 100644 --- a/lib/src/widgets/core/pod_core_player.dart +++ b/lib/src/widgets/core/pod_core_player.dart @@ -4,11 +4,13 @@ class _PodCoreVideoPlayer extends StatelessWidget { final VideoPlayerController videoPlayerCtr; final double videoAspectRatio; final String tag; + final BuildContext? fullScreenContext; const _PodCoreVideoPlayer({ required this.videoPlayerCtr, required this.videoAspectRatio, required this.tag, + required this.fullScreenContext, }); @override @@ -68,7 +70,10 @@ class _PodCoreVideoPlayer extends StatelessWidget { }, ), ), - _VideoOverlays(tag: tag), + _VideoOverlays( + tag: tag, + fullScreenContext: fullScreenContext, + ), IgnorePointer( child: GetBuilder( tag: tag, @@ -83,7 +88,7 @@ class _PodCoreVideoPlayer extends StatelessWidget { ), ); - if (kIsWeb) { + if (kIsWeb && podCtr.overlayBuilder == null) { switch (podCtr.podVideoState) { case PodVideoState.loading: return loadingWidget; diff --git a/lib/src/widgets/doubble_tap_effect.dart b/lib/src/widgets/doubble_tap_effect.dart index f23915f9..a9570a5a 100644 --- a/lib/src/widgets/doubble_tap_effect.dart +++ b/lib/src/widgets/doubble_tap_effect.dart @@ -199,7 +199,7 @@ class _DoubleTapRippleEffectState extends State fillColor: widget.rippleColor, ), ), - ) + ), ], ), ), diff --git a/lib/src/widgets/full_screen_view.dart b/lib/src/widgets/full_screen_view.dart index e26501ac..5d137786 100644 --- a/lib/src/widgets/full_screen_view.dart +++ b/lib/src/widgets/full_screen_view.dart @@ -2,8 +2,11 @@ part of 'package:pod_player/src/pod_player.dart'; class FullScreenView extends StatefulWidget { final String tag; + final BuildContext? fullScreenContext; + const FullScreenView({ required this.tag, + required this.fullScreenContext, super.key, }); @@ -17,7 +20,7 @@ class _FullScreenViewState extends State @override void initState() { _podCtr = Get.find(tag: widget.tag); - _podCtr.fullScreenContext = context; + _podCtr.fullScreenContext = widget.fullScreenContext ?? context; _podCtr.keyboardFocusWeb?.removeListener(_podCtr.keyboadListner); super.initState(); @@ -39,8 +42,8 @@ class _FullScreenViewState extends State strokeWidth: 2, ); - return WillPopScope( - onWillPop: () async { + return PopScope( + onPopInvoked: (_) async { if (kIsWeb) { await _podCtr.disableFullScreen( context, @@ -49,29 +52,32 @@ class _FullScreenViewState extends State ); } if (!kIsWeb) await _podCtr.disableFullScreen(context, widget.tag); - return true; }, child: Scaffold( backgroundColor: Colors.black, - body: GetBuilder( - tag: widget.tag, - builder: (podCtr) => Center( - child: ColoredBox( - color: Colors.black, - child: SizedBox( - height: MediaQuery.of(context).size.height, - width: MediaQuery.of(context).size.width, - child: Center( - child: podCtr.videoCtr == null - ? loadingWidget - : podCtr.videoCtr!.value.isInitialized - ? _PodCoreVideoPlayer( - tag: widget.tag, - videoPlayerCtr: podCtr.videoCtr!, - videoAspectRatio: - podCtr.videoCtr?.value.aspectRatio ?? 16 / 9, - ) - : loadingWidget, + body: SafeArea( + child: GetBuilder( + tag: widget.tag, + builder: (podCtr) => Center( + child: ColoredBox( + color: Colors.black, + child: SizedBox( + height: MediaQuery.of(context).size.height, + width: MediaQuery.of(context).size.width, + child: Center( + child: podCtr.videoCtr == null + ? loadingWidget + : podCtr.videoCtr!.value.isInitialized + ? _PodCoreVideoPlayer( + tag: widget.tag, + videoPlayerCtr: podCtr.videoCtr!, + videoAspectRatio: + podCtr.videoCtr?.value.aspectRatio ?? + 16 / 9, + fullScreenContext: widget.fullScreenContext, + ) + : loadingWidget, + ), ), ), ), diff --git a/pubspec.yaml b/pubspec.yaml index 88647f4e..93fc3da6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,24 +4,24 @@ version: 0.2.1 homepage: https://github.com/newtaDev/pod_player environment: - sdk: ">=2.17.0 <4.0.0" + sdk: ">=3.2.4 <4.0.0" flutter: ">=1.17.0" dependencies: flutter: sdk: flutter # services - video_player: ^2.7.0 - http: ^1.1.0 - get: ^4.6.5 - wakelock_plus: ^1.1.1 - universal_html: ^2.2.3 - youtube_explode_dart: ^2.0.1 + video_player: ^2.8.2 + http: ^1.2.0 + get: ^4.6.6 + wakelock_plus: ^1.1.4 + universal_html: ^2.2.4 + youtube_explode_dart: ^2.1.0 dev_dependencies: flutter_test: sdk: flutter - very_good_analysis: ^5.0.0+1 + very_good_analysis: ^5.1.0 screenshots: - description: Pod video player logo