From 2b21883c20e56b5b97b8175bfd121a33316b621b Mon Sep 17 00:00:00 2001 From: John Knipper Date: Wed, 6 Nov 2024 15:20:10 +0700 Subject: [PATCH] MAUI: Add MediaElement support --- .../Resources/Resource.Designer.cs | 2 +- .../App.xaml | 9 + .../App.xaml.cs | 51 + .../AppShell.xaml | 14 + .../AppShell.xaml.cs | 16 + ...ibVLCSharp.MAUI.Sample.MediaElement.csproj | 61 + .../MainPage.xaml | 22 + .../MainPage.xaml.cs | 30 + .../MainViewModel.cs | 92 ++ .../MauiProgram.cs | 33 + .../Platforms/Android/AndroidManifest.xml | 6 + .../Platforms/Android/MainActivity.cs | 12 + .../Platforms/Android/MainApplication.cs | 16 + .../Android/Resources/values/colors.xml | 6 + .../Platforms/MacCatalyst/AppDelegate.cs | 10 + .../Platforms/MacCatalyst/Info.plist | 30 + .../Platforms/MacCatalyst/Program.cs | 16 + .../Platforms/Windows/App.xaml | 8 + .../Platforms/Windows/App.xaml.cs | 25 + .../Platforms/Windows/Package.appxmanifest | 46 + .../Platforms/Windows/app.manifest | 15 + .../Platforms/iOS/AppDelegate.cs | 18 + .../Platforms/iOS/Info.plist | 32 + .../Platforms/iOS/Program.cs | 22 + .../Properties/launchSettings.json | 8 + .../Resources/AppIcon/appicon.svg | 4 + .../Resources/AppIcon/appiconfg.svg | 8 + .../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 107280 bytes .../Resources/Fonts/OpenSans-Semibold.ttf | Bin 0 -> 111164 bytes .../Resources/Images/dotnet_bot.svg | 93 ++ .../Resources/Raw/AboutAssets.txt | 15 + .../Resources/Splash/splash.svg | 8 + .../Resources/Styles/Colors.xaml | 44 + .../Resources/Styles/Styles.xaml | 405 +++++ .../AppHostBuilderExtensions.cs | 14 +- .../BufferingProgressToBoolConverter.cs | 33 + .../Converters/ObjectToBoolConverter.cs | 33 + src/LibVLCSharp.MAUI/Dispatcher.cs | 25 + src/LibVLCSharp.MAUI/DisplayInformation.cs | 17 + src/LibVLCSharp.MAUI/DisplayRequest.cs | 28 + src/LibVLCSharp.MAUI/Effects/ClickEffect.cs | 20 + src/LibVLCSharp.MAUI/IOrientationHandler.cs | 18 + src/LibVLCSharp.MAUI/IPowerManager.cs | 13 + src/LibVLCSharp.MAUI/ISystemUI.cs | 8 + src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj | 32 + src/LibVLCSharp.MAUI/MediaPlayerElement.xaml | 29 + .../MediaPlayerElement.xaml.cs | 315 ++++ src/LibVLCSharp.MAUI/PlaybackControls.xaml | 10 + src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs | 1363 +++++++++++++++++ .../Properties/AssemblyInfo.cs | 3 + src/LibVLCSharp.MAUI/README.md | 23 +- .../Resources/FontAwesomeCodes.cs | 64 + .../Resources/Fonts/FontAwesome5Brands.otf | Bin 0 -> 476372 bytes .../Resources/Fonts/FontAwesome5Solid.otf | Bin 0 -> 591768 bytes .../Resources/Strings.Designer.cs | 216 +++ .../Resources/Strings.fr.resx | 150 ++ src/LibVLCSharp.MAUI/Resources/Strings.resx | 171 +++ src/LibVLCSharp.MAUI/SwipeToUnLockView.cs | 175 +++ src/LibVLCSharp.MAUI/Themes/Generic.xaml | 333 ++++ src/LibVLCSharp.MAUI/Themes/Generic.xaml.cs | 15 + src/LibVLCSharp.MAUI/TrackViewModel.cs | 55 + src/LibVLCSharp.MAUI/VideoView.cs | 2 +- src/LibVLCSharp.MAUI/VideoViewHandler.cs | 2 +- src/LibVLCSharp.MAUI/VisualTreeHelper.cs | 85 + src/LibVLCSharp.Mac.sln | 387 ++--- src/LibVLCSharp.sln | 95 +- src/LibVLCSharp/Properties/AssemblyInfo.cs | 1 + .../MediaPlayerElement/SeekBarManager.cs | 19 +- 68 files changed, 4650 insertions(+), 281 deletions(-) create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Regular.ttf create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Semibold.ttf create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml create mode 100644 samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml create mode 100644 src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs create mode 100644 src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs create mode 100644 src/LibVLCSharp.MAUI/Dispatcher.cs create mode 100644 src/LibVLCSharp.MAUI/DisplayInformation.cs create mode 100644 src/LibVLCSharp.MAUI/DisplayRequest.cs create mode 100644 src/LibVLCSharp.MAUI/Effects/ClickEffect.cs create mode 100644 src/LibVLCSharp.MAUI/IOrientationHandler.cs create mode 100644 src/LibVLCSharp.MAUI/IPowerManager.cs create mode 100644 src/LibVLCSharp.MAUI/ISystemUI.cs create mode 100644 src/LibVLCSharp.MAUI/MediaPlayerElement.xaml create mode 100644 src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs create mode 100644 src/LibVLCSharp.MAUI/PlaybackControls.xaml create mode 100644 src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs create mode 100644 src/LibVLCSharp.MAUI/Properties/AssemblyInfo.cs create mode 100644 src/LibVLCSharp.MAUI/Resources/FontAwesomeCodes.cs create mode 100644 src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Brands.otf create mode 100644 src/LibVLCSharp.MAUI/Resources/Fonts/FontAwesome5Solid.otf create mode 100644 src/LibVLCSharp.MAUI/Resources/Strings.Designer.cs create mode 100644 src/LibVLCSharp.MAUI/Resources/Strings.fr.resx create mode 100644 src/LibVLCSharp.MAUI/Resources/Strings.resx create mode 100644 src/LibVLCSharp.MAUI/SwipeToUnLockView.cs create mode 100644 src/LibVLCSharp.MAUI/Themes/Generic.xaml create mode 100644 src/LibVLCSharp.MAUI/Themes/Generic.xaml.cs create mode 100644 src/LibVLCSharp.MAUI/TrackViewModel.cs create mode 100644 src/LibVLCSharp.MAUI/VisualTreeHelper.cs diff --git a/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs b/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs index a1dca9f4f..26deb00a7 100644 --- a/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs +++ b/samples/LibVLCSharp.Android.Sample/Resources/Resource.Designer.cs @@ -14,7 +14,7 @@ namespace LibVLCSharp.Android.Sample { - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "12.2.0.155")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "13.2.2.120")] public partial class Resource { diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml new file mode 100644 index 000000000..50ca86b67 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml @@ -0,0 +1,9 @@ + + + + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs new file mode 100644 index 000000000..88286d909 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/App.xaml.cs @@ -0,0 +1,51 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Maui.Controls; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// Represents the main App. + /// + public partial class App : Application + { + /// + /// Initializes a new instance of class. + /// + public App() + { + InitializeComponent(); + ConfigureUnhandledExceptionHandling(); + + MainPage = new MainPage(); + } + + private static void ConfigureUnhandledExceptionHandling() + { + AppDomain.CurrentDomain.UnhandledException += (sender, e) => + { + if (e.ExceptionObject is Exception ex) + { + HandleException(ex); + } + }; + + TaskScheduler.UnobservedTaskException += (sender, e) => + { + if (e.Exception is Exception ex) + { + HandleException(ex); + } + e.SetObserved(); // Prevents the process from terminating. + }; + } + + private static void HandleException(Exception ex) + { + if (ex != null) + { + Console.WriteLine(ex.Message); + } + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml new file mode 100644 index 000000000..6885a1c3a --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml @@ -0,0 +1,14 @@ + + + + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs new file mode 100644 index 000000000..7d3493c6f --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/AppShell.xaml.cs @@ -0,0 +1,16 @@ +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// Represents the main shell of the application. + /// + public partial class AppShell : Shell + { + /// + /// Initializes a new instance of the class. + /// + public AppShell() + { + InitializeComponent(); + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj new file mode 100644 index 000000000..b4b416ddf --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/LibVLCSharp.MAUI.Sample.MediaElement.csproj @@ -0,0 +1,61 @@ + + + net8.0-android;net8.0-ios + + + Exe + LibVLCSharp.MAUI.Sample.MediaElement + true + true + enable + latest + + LibVLCSharp.MAUI.Sample.MediaElement + + com.companyname.libvlcsharp.maui.sample.mediaelement + 3e92aff6-59b5-48cd-a2a0-3ecb5d63d8fb + + 1.0 + 1 + 11.0 + 13.1 + 21.0 + 10.0.17763.0 + 6.5 + True + 10.0.19041.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml new file mode 100644 index 000000000..8477da926 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs new file mode 100644 index 000000000..bccf31a82 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainPage.xaml.cs @@ -0,0 +1,30 @@ +using Microsoft.Maui.Controls; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// Represnets the Main Page. + /// + public partial class MainPage : ContentPage + { + /// + /// Initializes a new instance of class. + /// + public MainPage() + { + InitializeComponent(); + } + + void OnAppearing(object sender, System.EventArgs e) + { + base.OnAppearing(); + ((MainViewModel)BindingContext).OnAppearing(); + } + + void OnDisappearing(object sender, System.EventArgs e) + { + base.OnDisappearing(); + ((MainViewModel)BindingContext).OnDisappearing(); + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs new file mode 100644 index 000000000..6d8304e67 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MainViewModel.cs @@ -0,0 +1,92 @@ +using System; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using LibVLCSharp.Shared; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// Represents the main viewmodel. + /// + public class MainViewModel : INotifyPropertyChanged + { + /// + /// Property changed event + /// + public event PropertyChangedEventHandler PropertyChanged = null!; + + /// + /// Initializes a new instance of class. + /// + public MainViewModel() + { + } + + private LibVLC _libVLC; + + /// + /// Gets the instance. + /// + public LibVLC LibVLC + { + get => _libVLC; + private set => SetProperty(ref _libVLC, value); + } + + private LibVLCSharp.Shared.MediaPlayer _mediaPlayer; + /// + /// Gets the instance. + /// + public LibVLCSharp.Shared.MediaPlayer MediaPlayer + { + get => _mediaPlayer; + private set => SetProperty(ref _mediaPlayer, value); + } + + /// + /// Initialize LibVLC and playback when page appears + /// + public void OnAppearing() + { + if (LibVLC == null) + { + LibVLC = new LibVLC(enableDebugLogs: true); + } + + if (MediaPlayer == null) + { + var media = new Media(LibVLC, new Uri("http://streams.videolan.org/streams/mkv/multiple_tracks.mkv")); + MediaPlayer = new LibVLCSharp.Shared.MediaPlayer(media) + { + EnableHardwareDecoding = true + }; + media.Dispose(); + MediaPlayer.Play(); + } + } + + /// + /// Dispose MediaPlayer and LibVLC when page disappears + /// + public void OnDisappearing() + { + MediaPlayer?.Dispose(); + MediaPlayer = null; + + LibVLC?.Dispose(); + LibVLC = null; + } + + /// + /// Set property and notify UI + /// + private void SetProperty(ref T field, T value, [CallerMemberName] string propertyName = "") + { + if (!Equals(field, value)) + { + field = value; + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs new file mode 100644 index 000000000..a259a4e0f --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/MauiProgram.cs @@ -0,0 +1,33 @@ +using Microsoft.Extensions.Logging; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// The MauiProgram class is responsible for creating and configuring the MAUI application. + /// + public static class MauiProgram + { + /// + /// Creates and configures the MAUI application. + /// + /// The configured MAUI application. + public static MauiApp CreateMauiApp() + { + var builder = MauiApp.CreateBuilder(); + builder + .UseMauiApp() + .ConfigureFonts(fonts => + { + fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); + fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); + }) + .UseLibVLCSharp(); // Add your custom fonts and handler from your library + +#if DEBUG + builder.Logging.AddDebug(); +#endif + + return builder.Build(); + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml new file mode 100644 index 000000000..e9937ad77 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs new file mode 100644 index 000000000..83cdd2401 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainActivity.cs @@ -0,0 +1,12 @@ +using Android.App; +using Android.Content.PM; +using Android.OS; +using Microsoft.Maui; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] + public class MainActivity : MauiAppCompatActivity + { + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs new file mode 100644 index 000000000..c28054c29 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/MainApplication.cs @@ -0,0 +1,16 @@ +using Android.App; +using Android.Runtime; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + [Application] + public class MainApplication : MauiApplication + { + public MainApplication(IntPtr handle, JniHandleOwnership ownership) + : base(handle, ownership) + { + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml new file mode 100644 index 000000000..c04d7492a --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Android/Resources/values/colors.xml @@ -0,0 +1,6 @@ + + + #512BD4 + #2B0B98 + #2B0B98 + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs new file mode 100644 index 000000000..f0e33d31d --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/AppDelegate.cs @@ -0,0 +1,10 @@ +using Foundation; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + [Register("AppDelegate")] + public class AppDelegate : MauiUIApplicationDelegate + { + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist new file mode 100644 index 000000000..c96dd0a22 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Info.plist @@ -0,0 +1,30 @@ + + + + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs new file mode 100644 index 000000000..30090b8eb --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/MacCatalyst/Program.cs @@ -0,0 +1,16 @@ +using ObjCRuntime; +using UIKit; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + public class Program + { + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml new file mode 100644 index 000000000..8daf553d0 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml @@ -0,0 +1,8 @@ + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs new file mode 100644 index 000000000..e5405ac9b --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/App.xaml.cs @@ -0,0 +1,25 @@ +using Microsoft.UI.Xaml; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace LibVLCSharp.MAUI.Sample.MediaElement.WinUI +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + public partial class App : MauiWinUIApplication + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); + } + +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest new file mode 100644 index 000000000..fcdf34f18 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/Package.appxmanifest @@ -0,0 +1,46 @@ + + + + + + + + + $placeholder$ + User Name + $placeholder$.png + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest new file mode 100644 index 000000000..a62726014 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/Windows/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs new file mode 100644 index 000000000..6e7ff1fe9 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/AppDelegate.cs @@ -0,0 +1,18 @@ +using Foundation; +using Microsoft.Maui; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// The AppDelegate class is responsible for handling application-level events. + /// + [Register("AppDelegate")] + public class AppDelegate : MauiUIApplicationDelegate + { + /// + /// This method is used to create and configure the Maui application instance. + /// + /// Returns the configured application instance. + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist new file mode 100644 index 000000000..0004a4fde --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Info.plist @@ -0,0 +1,32 @@ + + + + + LSRequiresIPhoneOS + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs new file mode 100644 index 000000000..30641945e --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Platforms/iOS/Program.cs @@ -0,0 +1,22 @@ +using ObjCRuntime; +using UIKit; + +namespace LibVLCSharp.MAUI.Sample.MediaElement +{ + /// + /// The Program class contains the main entry point of the application. + /// + public class Program + { + /// + /// The main entry point of the application. + /// + /// An array of command-line arguments. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } + } +} diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json new file mode 100644 index 000000000..edf8aadcc --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Windows Machine": { + "commandName": "MsixPackage", + "nativeDebugging": false + } + } +} \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg new file mode 100644 index 000000000..9d63b6513 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appicon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg new file mode 100644 index 000000000..21dfb25f1 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/AppIcon/appiconfg.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Regular.ttf b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..39b6aff94d9aa1fbbf74fe545b99b98eae5d67c0 GIT binary patch literal 107280 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

^^HzNyPfE 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

*KL-Q@&%qtasj|} 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 bEcl^++y2yiPg2fe8x4iffwf!8HgNqvy%A~| literal 0 HcmV?d00001 diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg new file mode 100644 index 000000000..abfaff26a --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Images/dotnet_bot.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt new file mode 100644 index 000000000..15d624484 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Raw/AboutAssets.txt @@ -0,0 +1,15 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories). Deployment of the asset to your application +is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. + + + +These files will be deployed with you package and will be accessible using Essentials: + + async Task LoadMauiAsset() + { + using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); + using var reader = new StreamReader(stream); + + var contents = reader.ReadToEnd(); + } diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg new file mode 100644 index 000000000..21dfb25f1 --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Splash/splash.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml new file mode 100644 index 000000000..43ebcdedc --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Colors.xaml @@ -0,0 +1,44 @@ + + + + + #512BD4 + #DFD8F7 + #2B0B98 + White + Black + #E1E1E1 + #C8C8C8 + #ACACAC + #919191 + #6E6E6E + #404040 + #212121 + #141414 + + + + + + + + + + + + + + + #F7B548 + #FFD590 + #FFE5B9 + #28C2D1 + #7BDDEF + #C3F2F4 + #3E8EED + #72ACF1 + #A7CBF6 + + \ No newline at end of file diff --git a/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml new file mode 100644 index 000000000..7159c06db --- /dev/null +++ b/samples/MAUI/LibVLCSharp.MAUI.Sample.MediaElement/Resources/Styles/Styles.xaml @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs b/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs index ae0515d8d..9b40c1ec9 100644 --- a/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs +++ b/src/LibVLCSharp.MAUI/AppHostBuilderExtensions.cs @@ -10,10 +10,22 @@ public static class AppHostBuilderExtensions /// /// MauiAppBuilder /// configured builder for libvlcsharp - public static MauiAppBuilder UseLibVLCSharp(this MauiAppBuilder builder) => + public static MauiAppBuilder UseLibVLCSharp(this MauiAppBuilder builder) + { + // Register LibVLCSharp handlers builder.ConfigureMauiHandlers(handlers => { handlers.AddHandler(typeof(VideoView), typeof(VideoViewHandler)); }); + + // Configure custom fonts + builder.ConfigureFonts(fonts => + { + fonts.AddFont("FontAwesome5Brands.otf", "FontAwesomeBrands"); + fonts.AddFont("FontAwesome5Solid.otf", "FontAwesomeSolid"); + }); + + return builder; + } } } diff --git a/src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs b/src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs new file mode 100644 index 000000000..39d705c09 --- /dev/null +++ b/src/LibVLCSharp.MAUI/Converters/BufferingProgressToBoolConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using Microsoft.Maui.Controls; + +namespace LibVLCSharp.MAUI.Converters +{ + /// + /// Converts a value not equals to 0 and 1 to true. + /// + internal class BufferingProgressToBoolConverter : IValueConverter + { + /// + /// Modifies the source data before passing it to the target for display in the UI. + /// + /// The source data being passed to the target. + /// The type of the target property. + /// An optional parameter to be used in the converter logic. + /// The culture of the conversion. + /// true if value is not equals to 0 or 1, false otherwise + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value is double d && d != 0 && d != 1; + } + + /// + /// Not implemented + /// + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs b/src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs new file mode 100644 index 000000000..6bad71bec --- /dev/null +++ b/src/LibVLCSharp.MAUI/Converters/ObjectToBoolConverter.cs @@ -0,0 +1,33 @@ +using System; +using System.Globalization; +using Microsoft.Maui.Controls; + +namespace LibVLCSharp.MAUI.Converters +{ + /// + /// Converts not null object to true. + /// + internal class ObjectToBoolConverter : IValueConverter + { + /// + /// Modifies the source data before passing it to the target for display in the UI. + /// + /// The source data being passed to the target. + /// The type of the target property. + /// An optional parameter to be used in the converter logic. + /// The culture of the conversion. + /// true if value is not null, false otherwise + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + return value != null; + } + + /// + /// Not implemented + /// + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/LibVLCSharp.MAUI/Dispatcher.cs b/src/LibVLCSharp.MAUI/Dispatcher.cs new file mode 100644 index 000000000..eabc330c4 --- /dev/null +++ b/src/LibVLCSharp.MAUI/Dispatcher.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; +using LibVLCSharp.Shared.MediaPlayerElement; +using Microsoft.Maui.Controls; +using Microsoft.Maui; + +namespace LibVLCSharp.MAUI +{ + /// + /// Object that provides services for managing the queue of work items for a thread + /// + internal class Dispatcher : Shared.MediaPlayerElement.IDispatcher + { + /// + /// Schedules the provided callback on the UI thread from a worker thread + /// + /// The callback on which the dispatcher returns when the event is dispatched + /// The task object representing the asynchronous operation + public Task InvokeAsync(Action action) + { + Application.Current?.Dispatcher.Dispatch(action); + return Task.CompletedTask; + } + } +} diff --git a/src/LibVLCSharp.MAUI/DisplayInformation.cs b/src/LibVLCSharp.MAUI/DisplayInformation.cs new file mode 100644 index 000000000..b1ff2b516 --- /dev/null +++ b/src/LibVLCSharp.MAUI/DisplayInformation.cs @@ -0,0 +1,17 @@ +using LibVLCSharp.Shared.MediaPlayerElement; +using Microsoft.Maui.Controls; +using Microsoft.Maui; + +namespace LibVLCSharp.MAUI +{ + /// + /// Monitors display-related information for an application view. + /// + internal class DisplayInformation : IDisplayInformation + { + /// + /// Gets the scale factor + /// + public double ScalingFactor => DeviceDisplay.MainDisplayInfo.Density; + } +} diff --git a/src/LibVLCSharp.MAUI/DisplayRequest.cs b/src/LibVLCSharp.MAUI/DisplayRequest.cs new file mode 100644 index 000000000..720915834 --- /dev/null +++ b/src/LibVLCSharp.MAUI/DisplayRequest.cs @@ -0,0 +1,28 @@ +using LibVLCSharp.Shared.MediaPlayerElement; +using Microsoft.Maui.Controls; +using Microsoft.Maui; + +namespace LibVLCSharp.MAUI +{ + /// + /// Represents a display request + /// + internal class DisplayRequest : IDisplayRequest + { + /// + /// Activates a display request + /// + public void RequestActive() + { + DeviceDisplay.Current.KeepScreenOn = true; + } + + /// + /// Deactivates a display request + /// + public void RequestRelease() + { + DeviceDisplay.Current.KeepScreenOn = false; + } + } +} diff --git a/src/LibVLCSharp.MAUI/Effects/ClickEffect.cs b/src/LibVLCSharp.MAUI/Effects/ClickEffect.cs new file mode 100644 index 000000000..5b6642e66 --- /dev/null +++ b/src/LibVLCSharp.MAUI/Effects/ClickEffect.cs @@ -0,0 +1,20 @@ +using Microsoft.Maui.Controls; + +namespace LibVLCSharp.MAUI.Effects +{ + /// + /// Click effect. + /// + internal class ClickEffect : TriggerAction + { + /// + /// Apply a click effect. + /// + /// The object on which to invoke the trigger action. + protected override async void Invoke(VisualElement sender) + { + await sender.ScaleTo(0.85, 100); + await sender.ScaleTo(1, 50); + } + } +} diff --git a/src/LibVLCSharp.MAUI/IOrientationHandler.cs b/src/LibVLCSharp.MAUI/IOrientationHandler.cs new file mode 100644 index 000000000..2a8e868ec --- /dev/null +++ b/src/LibVLCSharp.MAUI/IOrientationHandler.cs @@ -0,0 +1,18 @@ +namespace LibVLCSharp.MAUI +{ + /// + /// Force Device Orientation. + /// + public interface IOrientationHandler + { + /// + /// Lock device's orientation. + /// + void LockOrientation(); + + /// + /// Unlock device's orientation. + /// + void UnLockOrientation(); + } +} diff --git a/src/LibVLCSharp.MAUI/IPowerManager.cs b/src/LibVLCSharp.MAUI/IPowerManager.cs new file mode 100644 index 000000000..fee934bb7 --- /dev/null +++ b/src/LibVLCSharp.MAUI/IPowerManager.cs @@ -0,0 +1,13 @@ +namespace LibVLCSharp.MAUI +{ + /// + /// Interface for power management. + /// + public interface IPowerManager + { + /// + /// Gets or sets a value indicating whether the screen should be kept on. + /// + bool KeepScreenOn { get; set; } + } +} diff --git a/src/LibVLCSharp.MAUI/ISystemUI.cs b/src/LibVLCSharp.MAUI/ISystemUI.cs new file mode 100644 index 000000000..07c6e5a5f --- /dev/null +++ b/src/LibVLCSharp.MAUI/ISystemUI.cs @@ -0,0 +1,8 @@ +namespace LibVLCSharp.MAUI +{ + internal interface ISystemUI + { + void ShowSystemUI(); + void HideSystemUI(); + } +} diff --git a/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj b/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj index d1af6db4b..40905a1ed 100644 --- a/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj +++ b/src/LibVLCSharp.MAUI/LibVLCSharp.MAUI.csproj @@ -16,8 +16,40 @@ LibVLC needs to be installed separately, see VideoLAN.LibVLC.* packages. + + + + + + + + + %(Filename) + Code + + + %(Filename) + Code + + + %(Filename) + Code + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + diff --git a/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml new file mode 100644 index 000000000..1e7ea8494 --- /dev/null +++ b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs new file mode 100644 index 000000000..ca2e5b735 --- /dev/null +++ b/src/LibVLCSharp.MAUI/MediaPlayerElement.xaml.cs @@ -0,0 +1,315 @@ +using System; +using LibVLCSharp.Shared; +using Microsoft.Maui.Controls.Xaml; +using Microsoft.Maui.Controls; +using Microsoft.Maui.Storage; + +namespace LibVLCSharp.MAUI +{ + /// + /// Represents event data for page-related events. + /// + public class PageEventArgs : EventArgs + { + /// + /// Gets the associated instance. + /// + public Page Page { get; } + + /// + /// Initializes a new instance of the class with the specified page. + /// + /// The page associated with the event. + public PageEventArgs(Page page) + { + Page = page; + } + } + + /// + /// Provides helper methods for handling page lifecycle events. + /// + public static class LifecycleHelper + { + private static readonly WeakEventManager _pageAppearingEventManager = new(); + private static readonly WeakEventManager _pageDisappearingEventManager = new(); + + /// + /// Occurs when a page is appearing. + /// + public static event EventHandler PageAppearing + { + add => _pageAppearingEventManager.AddEventHandler(value); + remove => _pageAppearingEventManager.RemoveEventHandler(value); + } + + /// + /// Occurs when a page is disappearing. + /// + public static event EventHandler PageDisappearing + { + add => _pageDisappearingEventManager.AddEventHandler(value); + remove => _pageDisappearingEventManager.RemoveEventHandler(value); + } + + /// + /// Registers the page lifecycle events to track page appearing and disappearing. + /// + public static void RegisterPageLifecycleEvents() + { + if (Application.Current != null) + { + Application.Current.PageAppearing += (s, e) => _pageAppearingEventManager.HandleEvent(s ?? Application.Current, new PageEventArgs(e), nameof(PageAppearing)); + Application.Current.PageDisappearing += (s, e) => _pageDisappearingEventManager.HandleEvent(s ?? Application.Current, new PageEventArgs(e), nameof(PageDisappearing)); + } + } + } + + /// + /// Represents an object that uses a to render audio and video to the display. + /// + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class MediaPlayerElement : ContentView + { + /// + /// Initializes a new instance of the class. + /// + public MediaPlayerElement() + { + InitializeComponent(); + LifecycleHelper.RegisterPageLifecycleEvents(); + } + + private bool Initialized { get; set; } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty LibVLCProperty = BindableProperty.Create(nameof(LibVLC), typeof(LibVLC), + typeof(MediaPlayerElement), propertyChanged: LibVLCPropertyChanged); + + /// + /// Gets the instance. + /// + public LibVLC LibVLC + { + get => (LibVLC)GetValue(LibVLCProperty); + set => SetValue(LibVLCProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty MediaPlayerProperty = BindableProperty.Create(nameof(MediaPlayer), + typeof(LibVLCSharp.Shared.MediaPlayer), typeof(MediaPlayerElement), propertyChanged: MediaPlayerPropertyChanged); + + /// + /// Gets the instance. + /// + public LibVLCSharp.Shared.MediaPlayer MediaPlayer + { + get => (LibVLCSharp.Shared.MediaPlayer)GetValue(MediaPlayerProperty); + set => SetValue(MediaPlayerProperty, value); + } + + private static readonly BindableProperty PlaybackControlsProperty = BindableProperty.Create(nameof(PlaybackControls), + typeof(PlaybackControls), typeof(MediaPlayerElement), propertyChanged: PlaybackControlsPropertyChanged); + + /// + /// Gets or sets the playback controls for the media. + /// + public PlaybackControls PlaybackControls + { + get => (PlaybackControls)GetValue(PlaybackControlsProperty); + set => SetValue(PlaybackControlsProperty, value); + } + + /// + /// Identifies the dependency property. + /// + private static readonly BindableProperty VideoViewProperty = BindableProperty.Create(nameof(VideoView), typeof(VideoView), + typeof(MediaPlayerElement), propertyChanged: VideoViewPropertyChanged); + + /// + /// Gets or sets the video view. + /// + public VideoView? VideoView + { + get => (VideoView)GetValue(VideoViewProperty); + private set => SetValue(VideoViewProperty, value); + } + + private static readonly BindableProperty EnableRendererDiscoveryProperty = BindableProperty.Create(nameof(EnableRendererDiscovery), + typeof(bool), typeof(PlaybackControls), true, propertyChanged: EnableRendererDiscoveryPropertyChanged); + + /// + /// Enable or disable renderer discovery. + /// + public bool EnableRendererDiscovery + { + get => (bool)GetValue(EnableRendererDiscoveryProperty); + set => SetValue(EnableRendererDiscoveryProperty, value); + } + + private void OnVideoViewChanged(VideoView videoView) + { + if (videoView != null) + { + videoView.MediaPlayer = MediaPlayer; + var playbackControls = PlaybackControls; + if (playbackControls != null) + { + playbackControls.VideoView = videoView; + } + } + } + + private void OnLibVLCChanged(LibVLC libVLC) + { + var playbackControls = PlaybackControls; + if (playbackControls != null) + { + playbackControls.LibVLC = libVLC; + } + } + + private void OnMediaPlayerChanged(LibVLCSharp.Shared.MediaPlayer mediaPlayer) + { + var videoView = VideoView; + if (videoView != null) + { + videoView.MediaPlayer = mediaPlayer; + } + var playbackControls = PlaybackControls; + if (playbackControls != null) + { + playbackControls.MediaPlayer = mediaPlayer; + } + } + + private void OnPlayControlsChanged(PlaybackControls playbackControls) + { + if (playbackControls != null) + { + playbackControls.IsCastButtonVisible = EnableRendererDiscovery; + playbackControls.LibVLC = LibVLC; + playbackControls.MediaPlayer = MediaPlayer; + playbackControls.VideoView = VideoView; + } + } + + private void OnEnableRendererDiscoveryChanged(bool enableRendererDiscovery) + { + var playbackControls = PlaybackControls; + if (playbackControls != null) + { + playbackControls.IsCastButtonVisible = enableRendererDiscovery; + } + } + + private static void VideoViewPropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + ((MediaPlayerElement)bindable).OnVideoViewChanged((VideoView)newValue); + } + + private static void LibVLCPropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + ((MediaPlayerElement)bindable).OnLibVLCChanged((LibVLC)newValue); + } + + private static void MediaPlayerPropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + ((MediaPlayerElement)bindable).OnMediaPlayerChanged((LibVLCSharp.Shared.MediaPlayer)newValue); + } + + private static void PlaybackControlsPropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + ((MediaPlayerElement)bindable).OnPlayControlsChanged((PlaybackControls)newValue); + } + + private static void EnableRendererDiscoveryPropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + ((MediaPlayerElement)bindable).OnEnableRendererDiscoveryChanged((bool)newValue); + } + + /// + /// Invoked whenever the of an element is set. + /// Implement this method in order to add behavior when the element is added to a parent. + /// + /// Implementors must call the base method. + protected override void OnParentSet() + { + base.OnParentSet(); + + if (Parent != null && !Initialized) + { + Initialized = true; + + if (VideoView == null) + { + VideoView = new VideoView(); + } + + if (PlaybackControls == null) + { + PlaybackControls = new PlaybackControls(); + } + + AttachLifecycleEvents(); + } + } + + private void AttachLifecycleEvents() + { + LifecycleHelper.PageAppearing += OnPageAppearing; + LifecycleHelper.PageDisappearing += OnPageDisappearing; + } + + /// + /// Handle page appearing logic + /// + /// + /// + private void OnPageAppearing(object? sender, EventArgs e) + { + if (sender is Page page && page == this.FindAncestor()) + { + var mediaPlayer = MediaPlayer; + if (mediaPlayer != null) + { + Preferences.Set($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_Position", mediaPlayer.Position); + Preferences.Set($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_IsPlaying", mediaPlayer.State == VLCState.Playing); + mediaPlayer.Stop(); + } + VideoView = null; + } + } + + /// + /// Handle page disappearing logic + /// minimize change. + /// + /// + private void OnPageDisappearing(object? sender, EventArgs e) + { + if (sender is Page page && page == this.FindAncestor()) + { + VideoView = new VideoView(); + var mediaPlayer = MediaPlayer; + if (mediaPlayer != null) + { + if (Preferences.Get($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_IsPlaying", false)) + { + mediaPlayer.Play(); + mediaPlayer.Position = Preferences.Get($"VLC_{mediaPlayer.NativeReference}_MediaPlayerElement_Position", 0f); + } + } + } + } + + private void GestureRecognized(object sender, EventArgs e) + { + PlaybackControls.Show(); + } + } +} diff --git a/src/LibVLCSharp.MAUI/PlaybackControls.xaml b/src/LibVLCSharp.MAUI/PlaybackControls.xaml new file mode 100644 index 000000000..fd279fb27 --- /dev/null +++ b/src/LibVLCSharp.MAUI/PlaybackControls.xaml @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs b/src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs new file mode 100644 index 000000000..8cceda26c --- /dev/null +++ b/src/LibVLCSharp.MAUI/PlaybackControls.xaml.cs @@ -0,0 +1,1363 @@ +using System; +using System.Collections.ObjectModel; +using System.Linq; +using System.Resources; +using System.Threading.Tasks; +using LibVLCSharp.MAUI.Resources; +using LibVLCSharp.Shared; +using LibVLCSharp.Shared.MediaPlayerElement; +using Microsoft.Maui.Controls.Xaml; +using Microsoft.Maui.Graphics; +using Microsoft.Maui.Controls; +using Microsoft.Maui; + +namespace LibVLCSharp.MAUI +{ + /// + /// Represents the playback controls for a . + /// + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class PlaybackControls : TemplatedView + { + private const string AudioSelectionAvailableState = "AudioSelectionAvailable"; + private const string VideoSelectionAvailableState = "VideoSelectionAvailable"; + private const string AudioSelectionUnavailableState = "AudioSelectionUnavailable"; + private const string VideoSelectionUnavailableState = "videoSelectionUnavailable"; + private const string ClosedCaptionsSelectionAvailableState = "ClosedCaptionsSelectionAvailable"; + private const string ClosedCaptionsSelectionUnavailableState = "ClosedCaptionsSelectionUnavailable"; + private const string PlayState = "PlayState"; + private const string PauseState = "PauseState"; + private const string PauseAvailableState = "PauseAvailable"; + private const string PauseUnavailableState = "PauseUnavailable"; + private const string SeekAvailableState = "SeekAvailable"; + private const string SeekUnavailableState = "SeekUnavailable"; + private const string CastAvailableState = "CastAvailable"; + private const string CastUnavailableState = "CastUnavailable"; + + /// + /// Initializes a new instance of class. + /// + public PlaybackControls() + { + InitializeComponent(); + + try + { + ButtonColor = (Color)(Resources[nameof(ButtonColor)] ?? Colors.Transparent); + Foreground = (Color)(Resources[nameof(Foreground)] ?? Colors.White); + MainColor = (Color)(Resources[nameof(MainColor)] ?? Colors.Transparent); + TracksButtonStyle = Resources[nameof(TracksButtonStyle)] as Style; + BufferingProgressBarStyle = Resources[nameof(BufferingProgressBarStyle)] as Style; + ButtonBarStyle = Resources[nameof(ButtonBarStyle)] as Style; + CastButtonStyle = Resources[nameof(CastButtonStyle)] as Style; + ControlsPanelStyle = Resources[nameof(ControlsPanelStyle)] as Style; + MessageStyle = Resources[nameof(MessageStyle)] as Style; + PlayPauseButtonStyle = Resources[nameof(PlayPauseButtonStyle)] as Style; + RemainingTimeLabelStyle = Resources[nameof(RemainingTimeLabelStyle)] as Style; + ElapsedTimeLabelStyle = Resources[nameof(ElapsedTimeLabelStyle)] as Style; + SeekBarStyle = Resources[nameof(SeekBarStyle)] as Style; + StopButtonStyle = Resources[nameof(StopButtonStyle)] as Style; + AspectRatioButtonStyle = Resources[nameof(AspectRatioButtonStyle)] as Style; + RewindButtonStyle = Resources[nameof(RewindButtonStyle)] as Style; + SeekButtonStyle = Resources[nameof(SeekButtonStyle)] as Style; + LockButtonStyle = Resources[nameof(LockButtonStyle)] as Style; + UnLockButtonStyle = Resources[nameof(UnLockButtonStyle)] as Style; + UnLockControlsPanelStyle = Resources[nameof(UnLockControlsPanelStyle)] as Style; + + Manager = new MediaPlayerElementManager(new Dispatcher(), new DisplayInformation(), new DisplayRequest()); + var autoHideManager = Manager.Get(); + autoHideManager.Shown += async (sender, e) => await FadeInAsync(); + autoHideManager.Hidden += async (sender, e) => await FadeOutAsync(); + autoHideManager.Enabled = ShowAndHideAutomatically; + var audioTrackManager = Manager.Get(); + audioTrackManager.TrackAdded += OnAudioTracksChanged; + audioTrackManager.TrackDeleted += OnAudioTracksChanged; + audioTrackManager.TracksCleared += OnAudioTracksChanged; + var videoTrackManager = Manager.Get(); + videoTrackManager.TrackAdded += OnVideoTracksChanged; + videoTrackManager.TrackDeleted += OnVideoTracksChanged; + videoTrackManager.TracksCleared += OnVideoTracksChanged; + var subTitlesTrackManager = Manager.Get(); + subTitlesTrackManager.TrackAdded += OnSubtitlesTracksChanged; + subTitlesTrackManager.TrackDeleted += OnSubtitlesTracksChanged; + subTitlesTrackManager.TracksCleared += OnSubtitlesTracksChanged; + var castRenderersDiscoverer = Manager.Get(); + castRenderersDiscoverer.CastAvailableChanged += (sender, e) => UpdateCastAvailability(); + castRenderersDiscoverer.Enabled = IsCastButtonVisible; + var seekBarManager = Manager.Get(); + seekBarManager.PositionChanged += SeekBarManager_PositionChanged; + seekBarManager.SeekableChanged += (sender, e) => UpdateSeekAvailability(); + var bufferingProgressNotifier = Manager.Get(); + bufferingProgressNotifier.Buffering += (sender, e) => OnBuffering(); + var stateManager = Manager.Get(); + stateManager.ErrorOccured += (sender, e) => ShowError(); + stateManager.ErrorCleared += (sender, e) => ErrorMessage = null; + stateManager.Playing += (sender, e) => OnPlaying(); + stateManager.Paused += (sender, e) => OnStoppedOrPaused(); + stateManager.Stopped += (sender, e) => OnStoppedOrPaused(); + stateManager.PlayPauseAvailableChanged += (sender, e) => UpdatePauseAvailability(); + } + catch (Exception ex) + { + ShowErrorMessageBox(ex); + } + } + + private void SeekBarManager_PositionChanged(object? sender, EventArgs e) + { + if (!Manager.Get().IsDragging) + { + UpdateTime(); + } + } + + /// + /// Finalizer + /// + ~PlaybackControls() + { + Manager.Dispose(); + } + + private MediaPlayerElementManager Manager { get; } = default!; + private Button? TracksButton { get; set; } + private Button? CastButton { get; set; } + private VisualElement? ControlsPanel { get; set; } + private VisualElement? ButtonBar { get; set; } + private VisualElement? UnLockControlsPanel { get; set; } + private VisualElement? TracksOverlayView { get; set; } + private SwipeToUnLockView? SwipeToUnLock { get; set; } + private Label? TrackBarLabel { get; set; } + private Label? AudioTracksLabel { get; set; } + private Label? VideoTracksLabel { get; set; } + private Label? SubtileTracksLabel { get; set; } + private Button? PlayPauseButton { get; set; } + private Label? RemainingTimeLabel { get; set; } + private Label? ElapsedTimeLabel { get; set; } + private Label? AspectRatioLabel { get; set; } + + private Slider? SeekBar { get; set; } + private ListView? AudioTracksListView { get; set; } + private ListView? VideoTracksListView { get; set; } + private ListView? SubtitlesTracksListView { get; set; } + private bool ScreenLockModeEnable { get; set; } = false; + + private bool Initialized { get; set; } + private ISystemUI? SystemUI => DependencyService.Get(); + private IOrientationHandler? OrientationHandler => DependencyService.Get(); + + private const int SEEK_OFFSET = 2000; + private bool RemoteRendering { get; set; } = false; + private const string Disconnect = "Disconnect"; + private const string Cancel = "Cancel"; + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ButtonColorProperty = BindableProperty.Create(nameof(ButtonColor), typeof(Color), + typeof(PlaybackControls)); + /// + /// Gets or sets the button color. + /// + public Color ButtonColor + { + get => (Color)GetValue(ButtonColorProperty); + set => SetValue(ButtonColorProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ForegroundProperty = BindableProperty.Create(nameof(Foreground), typeof(Color), + typeof(PlaybackControls)); + /// + /// Gets or sets the button color. + /// + public Color Foreground + { + get => (Color)GetValue(ForegroundProperty); + set => SetValue(ForegroundProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty MainColorProperty = BindableProperty.Create(nameof(MainColor), typeof(Color), + typeof(PlaybackControls)); + /// + /// Gets or sets the main color. + /// + public Color MainColor + { + get => (Color)GetValue(MainColorProperty); + set => SetValue(MainColorProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty TracksButtonStyleProperty = BindableProperty.Create( + nameof(TracksButtonStyle), typeof(Style), typeof(PlaybackControls)); + /// + /// Gets or sets the tracks button style. + /// + public Style? TracksButtonStyle + { + get => (Style)GetValue(TracksButtonStyleProperty); + set => SetValue(TracksButtonStyleProperty, value); + } + + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty BufferingProgressBarStyleProperty = BindableProperty.Create(nameof(BufferingProgressBarStyle), + typeof(Style), typeof(PlaybackControls)); + /// + /// Gets or sets the controls panel style. + /// + public Style? BufferingProgressBarStyle + { + get => (Style)GetValue(BufferingProgressBarStyleProperty); + set => SetValue(BufferingProgressBarStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ButtonBarStyleProperty = BindableProperty.Create(nameof(ButtonBarStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the button bar style. + /// + public Style? ButtonBarStyle + { + get => (Style)GetValue(ButtonBarStyleProperty); + set => SetValue(ButtonBarStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty CastButtonStyleProperty = BindableProperty.Create(nameof(CastButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the cast button style. + /// + public Style? CastButtonStyle + { + get => (Style)GetValue(CastButtonStyleProperty); + set => SetValue(CastButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ControlsPanelStyleProperty = BindableProperty.Create(nameof(ControlsPanelStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the controls panel style. + /// + public Style? ControlsPanelStyle + { + get => (Style)GetValue(ControlsPanelStyleProperty); + set => SetValue(ControlsPanelStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty UnLockControlsPanelStyleProperty = BindableProperty.Create(nameof(UnLockControlsPanelStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the unlock controls panel style. + /// + public Style? UnLockControlsPanelStyle + { + get => (Style)GetValue(UnLockControlsPanelStyleProperty); + set => SetValue(UnLockControlsPanelStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty UnLockButtonStyleProperty = BindableProperty.Create(nameof(UnLockButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the unlock controls panel style. + /// + public Style? UnLockButtonStyle + { + get => (Style)GetValue(UnLockButtonStyleProperty); + set => SetValue(UnLockButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty MessageStyleProperty = BindableProperty.Create(nameof(MessageStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the message style. + /// + public Style? MessageStyle + { + get => (Style)GetValue(MessageStyleProperty); + set => SetValue(MessageStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty PlayPauseButtonStyleProperty = BindableProperty.Create(nameof(PlayPauseButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the play/pause button style. + /// + public Style? PlayPauseButtonStyle + { + get => (Style)GetValue(PlayPauseButtonStyleProperty); + set => SetValue(PlayPauseButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty RemainingTimeLabelStyleProperty = BindableProperty.Create(nameof(RemainingTimeLabelStyle), + typeof(Style), typeof(PlaybackControls)); + /// + /// Gets or sets the remaining time label style. + /// + public Style? RemainingTimeLabelStyle + { + get => (Style)GetValue(RemainingTimeLabelStyleProperty); + set => SetValue(RemainingTimeLabelStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ElapsedTimeLabelStyleProperty = BindableProperty.Create(nameof(ElapsedTimeLabelStyle), + typeof(Style), typeof(PlaybackControls)); + /// + /// Gets or sets the elapsed time label style. + /// + public Style? ElapsedTimeLabelStyle + { + get => (Style)GetValue(ElapsedTimeLabelStyleProperty); + set => SetValue(ElapsedTimeLabelStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty SeekBarStyleProperty = BindableProperty.Create(nameof(SeekBarStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the seek bar style. + /// + public Style? SeekBarStyle + { + get => (Style)GetValue(SeekBarStyleProperty); + set => SetValue(SeekBarStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty StopButtonStyleProperty = BindableProperty.Create(nameof(StopButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the stop button style. + /// + public Style? StopButtonStyle + { + get => (Style)GetValue(StopButtonStyleProperty); + set => SetValue(StopButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty VideoViewProperty = BindableProperty.Create(nameof(VideoView), typeof(VideoView), + typeof(PlaybackControls), + propertyChanged: (bindable, oldValue, newValue) => ((PlaybackControls)bindable).Manager.VideoView = (IVideoControl)newValue); + + /// + /// Gets or sets the associated . + /// + /// It is only useful to set this property for the aspect ratio feature. + public VideoView? VideoView + { + get => (VideoView)GetValue(VideoViewProperty); + set => SetValue(VideoViewProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty LockButtonStyleProperty = BindableProperty.Create(nameof(LockButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the Lock button style. + /// + public Style? LockButtonStyle + { + get => (Style)GetValue(LockButtonStyleProperty); + set => SetValue(LockButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty AspectRatioButtonStyleProperty = BindableProperty.Create(nameof(AspectRatioButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the aspect ratio button style. + /// + public Style? AspectRatioButtonStyle + { + get => (Style)GetValue(AspectRatioButtonStyleProperty); + set => SetValue(AspectRatioButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty RewindButtonStyleProperty = BindableProperty.Create(nameof(RewindButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the rewind button style. + /// + public Style? RewindButtonStyle + { + get => (Style)GetValue(RewindButtonStyleProperty); + set => SetValue(RewindButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty SeekButtonStyleProperty = BindableProperty.Create(nameof(SeekButtonStyle), typeof(Style), + typeof(PlaybackControls)); + /// + /// Gets or sets the rewind button style. + /// + public Style? SeekButtonStyle + { + get => (Style)GetValue(SeekButtonStyleProperty); + set => SetValue(SeekButtonStyleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ButtonBarStartAreaProperty = BindableProperty.Create(nameof(ButtonBarStartArea), typeof(View), + typeof(PlaybackControls)); + /// + /// Gets or sets the view in the button bar start area. + /// + public View ButtonBarStartArea + { + get => (View)GetValue(ButtonBarStartAreaProperty); + set => SetValue(ButtonBarStartAreaProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ButtonBarEndAreaProperty = BindableProperty.Create(nameof(ButtonBarEndArea), typeof(View), + typeof(PlaybackControls)); + /// + /// Gets or sets the view in the button bar end area. + /// + public View ButtonBarEndArea + { + get => (View)GetValue(ButtonBarEndAreaProperty); + set => SetValue(ButtonBarEndAreaProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty LibVLCProperty = BindableProperty.Create(nameof(LibVLC), typeof(LibVLC), typeof(PlaybackControls), + propertyChanged: LibVLCPropertyChanged); + /// + /// Gets or sets the instance. + /// + public LibVLC LibVLC + { + get => (LibVLC)GetValue(LibVLCProperty); + set => SetValue(LibVLCProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty MediaPlayerProperty = BindableProperty.Create(nameof(MediaPlayer), + typeof(LibVLCSharp.Shared.MediaPlayer), typeof(PlaybackControls), propertyChanged: MediaPlayerPropertyChanged); + /// + /// Gets or sets the instance. + /// + public LibVLCSharp.Shared.MediaPlayer MediaPlayer + { + get => (LibVLCSharp.Shared.MediaPlayer)GetValue(MediaPlayerProperty); + set => SetValue(MediaPlayerProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty BufferingProgressProperty = BindableProperty.Create(nameof(BufferingProgress), typeof(double), + typeof(PlaybackControls)); + /// + /// Gets or sets a value corresponding to the buffering progress. + /// + public double BufferingProgress + { + get => (double)GetValue(BufferingProgressProperty); + set => SetValue(BufferingProgressProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ErrorMessageProperty = BindableProperty.Create(nameof(ErrorMessage), typeof(string), + typeof(PlaybackControls)); + /// + /// Gets the last error message. + /// + public string? ErrorMessage + { + get => (string)GetValue(ErrorMessageProperty); + private set => SetValue(ErrorMessageProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty KeepScreenOnProperty = BindableProperty.Create(nameof(KeepScreenOn), typeof(bool), + typeof(PlaybackControls), true, propertyChanged: KeepScreenOnPropertyChangedAsync); + /// + /// Gets or sets a value indicating whether the screen must be kept on when playing. + /// + public bool KeepScreenOn + { + get => (bool)GetValue(KeepScreenOnProperty); + set => SetValue(KeepScreenOnProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty PositionProperty = BindableProperty.Create(nameof(Position), typeof(TimeSpan), + typeof(PlaybackControls)); + /// + /// Gets or sets the playback position within the media. + /// + public TimeSpan Position + { + get => (TimeSpan)GetValue(PositionProperty); + set => SetValue(PositionProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ResourceManagerProperty = BindableProperty.Create(nameof(ResourceManager), typeof(ResourceManager), + typeof(PlaybackControls)); + /// + /// Gets or sets the resource manager to localize strings. + /// + public ResourceManager ResourceManager + { + get => (ResourceManager)GetValue(ResourceManagerProperty) ?? Strings.ResourceManager; + set => SetValue(ResourceManagerProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty ShowAndHideAutomaticallyProperty = BindableProperty.Create(nameof(ShowAndHideAutomatically), + typeof(bool), typeof(PlaybackControls), true, + propertyChanged: (bindable, oldValue, newValue) => ((PlaybackControls)bindable).OnShowAndHideAutomaticallyPropertyChanged()); + /// + /// Gets or sets a value that indicates whether the controls are shown and hidden automatically. + /// + public bool ShowAndHideAutomatically + { + get => (bool)GetValue(ShowAndHideAutomaticallyProperty); + set => SetValue(ShowAndHideAutomaticallyProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsLockButtonVisibleProperty = BindableProperty.Create(nameof(IsLockButtonVisible), typeof(bool), + typeof(PlaybackControls), true); + /// + /// Gets or sets a value that indicates whether the lock button is shown. + /// + public bool IsLockButtonVisible + { + get => (bool)GetValue(IsLockButtonVisibleProperty); + set => SetValue(IsLockButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsTracksButtonVisibleProperty = BindableProperty.Create(nameof(IsTracksButtonVisible), typeof(bool), + typeof(PlaybackControls), true); + /// + /// Gets or sets a value that indicates whether the tracks button is shown. + /// + public bool IsTracksButtonVisible + { + get => (bool)GetValue(IsTracksButtonVisibleProperty); + set => SetValue(IsTracksButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsCastButtonVisibleProperty = BindableProperty.Create(nameof(IsCastButtonVisible), typeof(bool), + typeof(PlaybackControls), true, propertyChanged: IsCastButtonVisiblePropertyChangedAsync); + /// + /// Gets or sets a value indicating whether the cast button is shown. + /// + public bool IsCastButtonVisible + { + get => (bool)GetValue(IsCastButtonVisibleProperty); + set => SetValue(IsCastButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsPlayPauseButtonVisibleProperty = BindableProperty.Create(nameof(IsPlayPauseButtonVisible), + typeof(bool), typeof(PlaybackControls), true, propertyChanged: IsPlayPauseButtonVisiblePropertyChanged); + /// + /// Gets or sets a value indicating whether the play/pause button is shown. + /// + public bool IsPlayPauseButtonVisible + { + get => (bool)GetValue(IsPlayPauseButtonVisibleProperty); + set => SetValue(IsPlayPauseButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsSeekEnabledProperty = BindableProperty.Create(nameof(IsSeekEnabled), typeof(bool), + typeof(PlaybackControls), true); + /// + /// Gets or sets a value that indicates whether a user can use the seek bar to find a location in the media. + /// + public bool IsSeekEnabled + { + get => (bool)GetValue(IsSeekEnabledProperty); + set => SetValue(IsSeekEnabledProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsSeekBarVisibleProperty = BindableProperty.Create(nameof(IsSeekBarVisible), typeof(bool), + typeof(PlaybackControls), true); + /// + /// Gets or sets a value that indicates whether the seek bar is shown. + /// + public bool IsSeekBarVisible + { + get => (bool)GetValue(IsSeekBarVisibleProperty); + set => SetValue(IsSeekBarVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsStopButtonVisibleProperty = BindableProperty.Create(nameof(IsStopButtonVisible), typeof(bool), + typeof(PlaybackControls)); + /// + /// Gets or sets a value that indicates whether the stop button is shown. + /// + public bool IsStopButtonVisible + { + get => (bool)GetValue(IsStopButtonVisibleProperty); + set => SetValue(IsStopButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsAspectRatioButtonVisibleProperty = BindableProperty.Create(nameof(IsAspectRatioButtonVisible), + typeof(bool), typeof(PlaybackControls), true); + /// + /// Gets or sets a value indicating whether the aspect ratio button is shown. + /// + public bool IsAspectRatioButtonVisible + { + get => (bool)GetValue(IsAspectRatioButtonVisibleProperty); + set => SetValue(IsAspectRatioButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// s + public static readonly BindableProperty IsRewindButtonVisibleProperty = BindableProperty.Create(nameof(IsRewindButtonVisible), + typeof(bool), typeof(PlaybackControls), true); + /// + /// Gets or sets a value indicating whether the rewind button is shown. + /// + public bool IsRewindButtonVisible + { + get => (bool)GetValue(IsRewindButtonVisibleProperty); + set => SetValue(IsRewindButtonVisibleProperty, value); + } + + /// + /// Identifies the dependency property. + /// + public static readonly BindableProperty IsSeekButtonVisibleProperty = BindableProperty.Create(nameof(IsSeekButtonVisible), + typeof(bool), typeof(PlaybackControls), true); + /// + /// Gets or sets a value indicating whether the seek button is shown. + /// + public bool IsSeekButtonVisible + { + get => (bool)GetValue(IsSeekButtonVisibleProperty); + set => SetValue(IsSeekButtonVisibleProperty, value); + } + + /// + /// Called when the property has changed. + /// + protected override void OnParentSet() + { + base.OnParentSet(); + if (Parent != null && !Initialized) + { + Initialized = true; + OnApplyCustomTemplate(); + } + } + + private void OnApplyCustomTemplate() + { + TracksButton = SetClickEventHandler(nameof(TracksButton), TracksButton_Clicked); + CastButton = SetClickEventHandler(nameof(CastButton), CastButton_ClickedAsync); + PlayPauseButton = SetClickEventHandler(nameof(PlayPauseButton), PlayPauseButton_Clicked); + SetClickEventHandler("StopButton", StopButton_Clicked); + SetClickEventHandler("LockButton", LockButton_ClickedAsync); + SetClickEventHandler("AspectRatioButton", AspectRatioButton_ClickedAsync); + ControlsPanel = this.FindChild(nameof(ControlsPanel)); + ButtonBar = this.FindChild(nameof(ButtonBar)); + UnLockControlsPanel = this.FindChild(nameof(UnLockControlsPanel)); + TracksOverlayView = this.FindChild(nameof(TracksOverlayView)); + SwipeToUnLock = this.FindChild(nameof(SwipeToUnLock)); + SeekBar = this.FindChild(nameof(SeekBar)); + AudioTracksListView = this.FindChild(nameof(AudioTracksListView)); + if (AudioTracksListView != null) + AudioTracksListView.ItemTapped += AudioTracksItemTapped; + VideoTracksListView = this.FindChild(nameof(VideoTracksListView)); + if (VideoTracksListView != null) + VideoTracksListView.ItemTapped += VideoTracksItemTapped; + SubtitlesTracksListView = this.FindChild(nameof(SubtitlesTracksListView)); + if (SubtitlesTracksListView != null) + SubtitlesTracksListView.ItemTapped += SubtitlesTracksItemTapped; + TrackBarLabel = this.FindChild