From bba92d11c22e71cfaf58d3694b6a652d7b880a28 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 24 May 2024 08:10:47 -0700 Subject: [PATCH 01/26] Add full screen state management for media elements This commit introduces full screen state management for media elements. The `CommunityToolkit.Maui.Primitives` namespace was added to several files to support this feature. A new `MediaElementScreenState` enum and `FullScreenStateChangedEventArgs` class were added to represent the full screen state and event data respectively. The `IMediaElement` and `MediaElement` interfaces were updated to include a `FullScreenState` property, a `FullScreenStateChanged` event, and a `FullScreenChanged` method. The `MediaElementPage` class now subscribes to the `FullScreenStateChanged` event and logs information when triggered. The `MauiMediaElement` classes for Android and Windows, and the `MediaManagerDelegate` class for MacOS, were updated to include a `WindowsChanged` event that triggers when the full screen state changes. The `MediaManager` classes for Android, MacOS, and Windows now subscribe to the `WindowsChanged` event and update the full screen state when triggered. The `MediaManager` class for MacOS sets the `Delegate` property of the `AVPlayerViewController` to a new instance of `MediaManagerDelegate`. --- .../MediaElement/MediaElementPage.xaml.cs | 4 +++ .../Interfaces/IMediaElement.cs | 17 +++++++++ .../MediaElement.shared.cs | 36 +++++++++++++++++++ .../FullScreenStateChangedEventArgs.cs | 28 +++++++++++++++ .../Primitives/MediaElementFullScreenState.cs | 17 +++++++++ .../Views/MauiMediaElement.android.cs | 10 ++++++ .../Views/MauiMediaElement.windows.cs | 9 +++++ .../Views/MediaManager.android.cs | 15 +++++++- .../Views/MediaManager.macios.cs | 23 +++++++++++- .../Views/MediaManager.shared.cs | 1 - .../Views/MediaManager.windows.cs | 15 +++++++- 11 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs create mode 100644 src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml.cs index 0908e8bd83..9f4d30fce1 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml.cs @@ -1,5 +1,6 @@ using System.ComponentModel; using CommunityToolkit.Maui.Core.Primitives; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Sample.ViewModels.Views; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; @@ -21,8 +22,11 @@ public MediaElementPage(MediaElementViewModel viewModel, ILogger + logger.LogInformation("FullScreen State Changed. Old State: {PreviousState}, New State: {NewState}", e.PreviousState, e.NewState); void MediaElement_PropertyChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName == MediaElement.DurationProperty.PropertyName) diff --git a/src/CommunityToolkit.Maui.MediaElement/Interfaces/IMediaElement.cs b/src/CommunityToolkit.Maui.MediaElement/Interfaces/IMediaElement.cs index fc621bc902..a79ffca13f 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Interfaces/IMediaElement.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Interfaces/IMediaElement.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Maui.Core.Primitives; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; namespace CommunityToolkit.Maui.Core; @@ -19,6 +20,11 @@ public interface IMediaElement : IView, IAsynchronousMediaElementHandler /// MediaElementState CurrentState { get; } + /// + /// Gets the full screen state of the media element. + /// + MediaElementScreenState FullScreenState { get;} + /// /// Gets the height (in pixels) of the loaded media in pixels. /// @@ -96,6 +102,11 @@ public interface IMediaElement : IView, IAsynchronousMediaElementHandler /// event EventHandler PositionChanged; + /// + /// Occurs when the changes. + /// + event EventHandler FullScreenStateChanged; + /// /// Occurs when the media has ended playing successfully. /// @@ -146,4 +157,10 @@ public interface IMediaElement : IView, IAsynchronousMediaElementHandler /// /// The new state the transitioned to. internal void CurrentStateChanged(MediaElementState newState); + + /// + /// Triggers a change. + /// + /// + internal void FullScreenChanged(MediaElementScreenState newState); } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs b/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs index f08c4435c8..ee50eb8126 100644 --- a/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs @@ -2,6 +2,7 @@ using CommunityToolkit.Maui.Converters; using CommunityToolkit.Maui.Core; using CommunityToolkit.Maui.Core.Primitives; +using CommunityToolkit.Maui.Primitives; namespace CommunityToolkit.Maui.Views; @@ -31,6 +32,14 @@ public class MediaElement : View, IMediaElement, IDisposable /// public static readonly BindableProperty DurationProperty = durationPropertyKey.BindableProperty; + /// + /// Backing store for the property. + /// + public static readonly BindableProperty FullScreenProperty = + BindableProperty.Create(nameof(FullScreenState), typeof(MediaElementScreenState), typeof(MediaElement), + MediaElementScreenState.Default, propertyChanged: OnFullScreenPropertyChanged); + + /// /// Backing store for the property. /// @@ -134,6 +143,13 @@ public event EventHandler SeekCompleted remove => eventManager.RemoveEventHandler(value); } + /// + public event EventHandler FullScreenStateChanged + { + add => eventManager.AddEventHandler(value); + remove => eventManager.RemoveEventHandler(value); + } + /// public event EventHandler StateChanged { @@ -334,6 +350,14 @@ public MediaElementState CurrentState private set => SetValue(CurrentStateProperty, value); } + /// + /// Gets the full screen state of the media element. + /// + public MediaElementScreenState FullScreenState + { + get => (MediaElementScreenState)GetValue(FullScreenProperty); + private set => SetValue(FullScreenProperty, value); + } TimeSpan IMediaElement.Position { get => (TimeSpan)GetValue(PositionProperty); @@ -459,6 +483,15 @@ static void OnSourcePropertyChanged(BindableObject bindable, object oldValue, ob static void OnSourcePropertyChanging(BindableObject bindable, object oldValue, object newValue) => ((MediaElement)bindable).OnSourcePropertyChanging((MediaSource?)oldValue); + static void OnFullScreenPropertyChanged(BindableObject bindable, object oldValue, object newValue) + { + var MediaElement = (MediaElement)bindable; + var previousState = (MediaElementScreenState)oldValue; + var newState = (MediaElementScreenState)newValue; + + MediaElement.OnFullScreenChanged(new FullScreenStateChangedEventArgs(previousState, newState)); + } + static void OnCurrentStatePropertyChanged(BindableObject bindable, object oldValue, object newValue) { var MediaElement = (MediaElement)bindable; @@ -561,6 +594,7 @@ void IMediaElement.SeekCompleted() } void IMediaElement.CurrentStateChanged(MediaElementState newState) => CurrentState = newState; + void IMediaElement.FullScreenChanged(MediaElementScreenState newState) => FullScreenState = newState; void OnPositionChanged(MediaPositionChangedEventArgs mediaPositionChangedEventArgs) => eventManager.HandleEvent(this, mediaPositionChangedEventArgs, nameof(PositionChanged)); @@ -568,6 +602,8 @@ void OnPositionChanged(MediaPositionChangedEventArgs mediaPositionChangedEventAr void OnStateChanged(MediaStateChangedEventArgs mediaStateChangedEventArgs) => eventManager.HandleEvent(this, mediaStateChangedEventArgs, nameof(StateChanged)); + void OnFullScreenChanged(FullScreenStateChangedEventArgs fullScreenStateChangedEventArgs) => + eventManager.HandleEvent(this, fullScreenStateChangedEventArgs, nameof(FullScreenStateChanged)); void OnPauseRequested() => eventManager.HandleEvent(this, EventArgs.Empty, nameof(PauseRequested)); void OnPlayRequested() => eventManager.HandleEvent(this, EventArgs.Empty, nameof(PlayRequested)); diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs new file mode 100644 index 0000000000..3b95eb6c4d --- /dev/null +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs @@ -0,0 +1,28 @@ +namespace CommunityToolkit.Maui.Primitives; + +/// +/// Event data for when the full screen state of the media element has changed. +/// +public sealed class FullScreenStateChangedEventArgs +{ + /// + /// Initializes a new instance of the class. + /// + /// + /// + public FullScreenStateChangedEventArgs(MediaElementScreenState previousState, MediaElementScreenState newState) + { + PreviousState = previousState; + NewState = newState; + } + + /// + /// Gets the previous state that the instance is transitioning from. + /// + public MediaElementScreenState PreviousState { get; } + + /// + /// Gets the new state that the instance is transitioning to. + /// + public MediaElementScreenState NewState { get; } +} diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs new file mode 100644 index 0000000000..6a82e3564b --- /dev/null +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs @@ -0,0 +1,17 @@ +namespace CommunityToolkit.Maui.Primitives; + +/// +/// +/// +public enum MediaElementScreenState +{ + /// + /// Full screen. + /// + FullScreen, + + /// + /// The default state. + /// + Default, +} diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index 669ff5d5b3..b210152b0f 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -9,6 +9,7 @@ using AndroidX.Core.View; using Com.Google.Android.Exoplayer2.UI; using CommunityToolkit.Maui.Views; +using CommunityToolkit.Maui.Primitives; namespace CommunityToolkit.Maui.Core.Views; @@ -17,6 +18,11 @@ namespace CommunityToolkit.Maui.Core.Views; /// public class MauiMediaElement : CoordinatorLayout { + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + public static event EventHandler? WindowsChanged; + readonly StyledPlayerView playerView; int defaultSystemUiVisibility; bool isSystemBarVisible; @@ -48,6 +54,8 @@ public MauiMediaElement(Context context, StyledPlayerView playerView) : base(con AddView(playerView); } + static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); + public override void OnDetachedFromWindow() { if (isFullScreen) @@ -146,6 +154,7 @@ void OnFullscreenButtonClick(object? sender, StyledPlayerView.FullscreenButtonCl item.Height = displayMetrics.HeightPixels; layout?.AddView(playerView, item); SetSystemBarsVisibility(); + MauiMediaElement.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } else { @@ -158,6 +167,7 @@ void OnFullscreenButtonClick(object? sender, StyledPlayerView.FullscreenButtonCl layout?.RemoveView(playerView); AddView(playerView, item); SetSystemBarsVisibility(); + MauiMediaElement.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index 9b830b80f5..fd57da1247 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Maui.Extensions; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; using Microsoft.UI; using Microsoft.UI.Windowing; @@ -31,6 +32,11 @@ public class MauiMediaElement : Grid, IDisposable readonly Button fullScreenButton; readonly MediaPlayerElement mediaPlayerElement; + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + public static event EventHandler? WindowsChanged; + bool doesNavigationBarExistBeforeFullScreen; bool isDisposed; @@ -90,6 +96,7 @@ public void Dispose() Dispose(true); GC.SuppressFinalize(this); } + static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); /// /// Gets the presented page. @@ -173,6 +180,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; + MauiMediaElement.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } else { @@ -200,6 +208,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) { popup.IsOpen = true; } + MauiMediaElement.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs index f12b0e61a8..e96034b6c7 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs @@ -11,6 +11,7 @@ using CommunityToolkit.Maui.Core.Primitives; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; +using CommunityToolkit.Maui.Primitives; namespace CommunityToolkit.Maui.Core.Views; @@ -46,10 +47,22 @@ public partial class MediaManager : Java.Lang.Object, IPlayer.IListener ControllerAutoShow = false, LayoutParameters = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) }; - + MauiMediaElement.WindowsChanged += OnWindowsChanged; return (Player, PlayerView); } + void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) + { + if (MediaElement is not null) + { + MediaElement.FullScreenChanged(e.NewState); + } + else + { + Logger?.LogWarning("MediaElement is null"); + } + } + /// /// Occurs when ExoPlayer changes the playback parameters. /// diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index 20c34fa971..9b567c22da 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -1,11 +1,13 @@ using AVFoundation; using AVKit; using CommunityToolkit.Maui.Core.Primitives; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; using CoreFoundation; using CoreMedia; using Foundation; using Microsoft.Extensions.Logging; +using UIKit; namespace CommunityToolkit.Maui.Core.Views; @@ -90,7 +92,8 @@ public partial class MediaManager : IDisposable Player = new(); PlayerViewController = new() { - Player = Player + Player = Player, + Delegate = new MediaManagerDelegate() }; // Pre-initialize Volume and Muted properties to the player object @@ -588,4 +591,22 @@ void RateChanged(object? sender, NSNotificationEventArgs args) MediaElement.Speed = Player.Rate; } } +} + +sealed class MediaManagerDelegate : AVPlayerViewControllerDelegate +{ + /// + /// Handles the event when the windows change. + /// + public static event EventHandler? WindowsChanged; + public override void WillBeginFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) + { + MediaManagerDelegate.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + } + public override void WillEndFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) + { + MediaManagerDelegate.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + } + + static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 253f5beaa8..e3dcde5f1a 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -34,7 +34,6 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche MauiContext = context; Dispatcher = dispatcher; MediaElement = mediaElement; - Logger = MauiContext.Services.GetRequiredService().CreateLogger(nameof(MediaManager)); } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs index aba821f579..d6ca07a1ad 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs @@ -1,4 +1,5 @@ using CommunityToolkit.Maui.Core.Primitives; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; using Microsoft.UI.Xaml.Controls; @@ -41,7 +42,6 @@ public PlatformMediaElement CreatePlatformView() Player = new(); WindowsMediaElement MediaElement = new(); MediaElement.MediaOpened += OnMediaElementMediaOpened; - Player.SetMediaPlayer(MediaElement); Player.MediaPlayer.PlaybackSession.PlaybackRateChanged += OnPlaybackSessionPlaybackRateChanged; @@ -52,9 +52,22 @@ public PlatformMediaElement CreatePlatformView() Player.MediaPlayer.VolumeChanged += OnMediaElementVolumeChanged; Player.MediaPlayer.IsMutedChanged += OnMediaElementIsMutedChanged; + MauiMediaElement.WindowsChanged += OnWindowsChanged; return Player; } + void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) + { + if(MediaElement is not null) + { + MediaElement.FullScreenChanged(e.NewState); + } + else + { + Logger?.LogWarning("MediaElement is null"); + } + } + /// /// Releases the managed and unmanaged resources used by the . /// From 6db6b06fb9652e6bb315245e2dae6590f205a3be Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Sun, 16 Jun 2024 15:17:38 -0700 Subject: [PATCH 02/26] fix merge bug --- .../Views/MediaManager.android.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs index 9069680049..742b4836dd 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs @@ -79,15 +79,6 @@ public partial class MediaManager : Java.Lang.Object, IPlayer.IListener { return bitmap; } - PlayerView = new StyledPlayerView(MauiContext.Context) - { - Player = Player, - UseController = false, - ControllerAutoShow = false, - LayoutParameters = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) - }; - MauiMediaElement.WindowsChanged += OnWindowsChanged; - return (Player, PlayerView); } void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) @@ -220,7 +211,7 @@ or PlaybackStateCompat.StateSkippingToQueueItem ControllerAutoShow = false, LayoutParameters = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) }; - + MauiMediaElement.WindowsChanged += OnWindowsChanged; checkPermissionsTask = CheckAndRequestForegroundPermission(checkPermissionSourceToken.Token); return (Player, PlayerView); } From 17601c307a6c5b31ecd551f99f5d5214b8f2a304 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Sun, 16 Jun 2024 15:53:02 -0700 Subject: [PATCH 03/26] Enhance fullscreen event handling - Updated MediaElementPage.xaml to include a new event handler `FullScreenStateChanged` for better responsiveness to fullscreen changes. - Removed subscription to `FullScreenStateChanged` in MediaElementPage.xaml.cs, indicating a shift in how fullscreen changes are managed. - Improved Android fullscreen support in MauiMediaElement.android.cs by invoking `OnWindowsChanged` with `FullScreenStateChangedEventArgs` to accurately track fullscreen state changes. --- .../Pages/Views/MediaElement/MediaElementPage.xaml | 3 ++- .../Pages/Views/MediaElement/MediaElementPage.xaml.cs | 1 - .../Views/MauiMediaElement.android.cs | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml b/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml index df6de2bc37..84457ae7ab 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Views/MediaElement/MediaElementPage.xaml @@ -39,7 +39,8 @@ MediaOpened="OnMediaOpened" PositionChanged="OnPositionChanged" StateChanged="OnStateChanged" - SeekCompleted="OnSeekCompleted"/> + SeekCompleted="OnSeekCompleted" + FullScreenStateChanged="MediaElement_FullScreenStateChanged"/> public class MauiMediaElement : CoordinatorLayout { - /// - /// An event that is raised when the full screen state of the media element has changed. - /// - public static event EventHandler? WindowsChanged; + readonly StyledPlayerView playerView; int defaultSystemUiVisibility; @@ -60,7 +57,6 @@ public MauiMediaElement(Context context, StyledPlayerView playerView) : base(con AddView(relativeLayout); } - static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); public override void OnDetachedFromWindow() { @@ -123,14 +119,14 @@ void OnFullscreenButtonClick(object? sender, StyledPlayerView.FullscreenButtonCl isFullScreen = true; RemoveView(relativeLayout); layout?.AddView(relativeLayout); - OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } else { isFullScreen = false; layout?.RemoveView(relativeLayout); AddView(relativeLayout); - OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } // Hide/Show the SystemBars and Status bar SetSystemBarsVisibility(); diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index 516667197e..4e5b0df22c 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -8,13 +8,11 @@ using Microsoft.UI.Xaml.Controls.Primitives; using Microsoft.UI.Xaml.Input; using Microsoft.UI.Xaml.Media; -using Microsoft.UI.Xaml.Media.Imaging; using WinRT.Interop; using Application = Microsoft.Maui.Controls.Application; using Button = Microsoft.UI.Xaml.Controls.Button; using Colors = Microsoft.UI.Colors; using Grid = Microsoft.UI.Xaml.Controls.Grid; -using ImageSource = Microsoft.UI.Xaml.Media.ImageSource; using Page = Microsoft.Maui.Controls.Page; using SolidColorBrush = Microsoft.UI.Xaml.Media.SolidColorBrush; using Thickness = Microsoft.UI.Xaml.Thickness; @@ -36,11 +34,6 @@ public class MauiMediaElement : Grid, IDisposable readonly FontIcon fullScreenIcon = new() { Glyph = "\uE740", FontFamily = new FontFamily("Segoe Fluent Icons") }; readonly FontIcon exitFullScreenIcon = new() { Glyph = "\uE73F", FontFamily = new FontFamily("Segoe Fluent Icons") }; - /// - /// An event that is raised when the full screen state of the media element has changed. - /// - public static event EventHandler? WindowsChanged; - bool doesNavigationBarExistBeforeFullScreen; bool isDisposed; @@ -92,7 +85,6 @@ public void Dispose() Dispose(true); GC.SuppressFinalize(this); } - static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); /// /// Gets the presented page. @@ -179,7 +171,8 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; - MauiMediaElement.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + + MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } else { @@ -208,7 +201,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) { popup.IsOpen = true; } - MauiMediaElement.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs index dbf47bce45..421a0baa0b 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs @@ -18,9 +18,9 @@ using CommunityToolkit.Maui.ApplicationModel.Permissions; using CommunityToolkit.Maui.Core.Primitives; using CommunityToolkit.Maui.Media.Services; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; -using CommunityToolkit.Maui.Primitives; namespace CommunityToolkit.Maui.Core.Views; @@ -211,7 +211,7 @@ or PlaybackStateCompat.StateSkippingToQueueItem ControllerAutoShow = false, LayoutParameters = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) }; - MauiMediaElement.WindowsChanged += OnWindowsChanged; + FullScreenEvents.WindowsChanged += OnWindowsChanged; checkPermissionsTask = CheckAndRequestForegroundPermission(checkPermissionSourceToken.Token); return (Player, PlayerView); } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index 2f318e3b62..a0b906344e 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -16,13 +16,6 @@ namespace CommunityToolkit.Maui.Core.Views; public partial class MediaManager : IDisposable { Metadata? metaData; - static event EventHandler? WindowsChanged; - - /// - /// Static event that is raised when the full screen state of the media element has changed. - /// - /// - public static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); // Media would still start playing when Speed was set although ShouldAutoPlay=False // This field was added to overcome that. @@ -129,7 +122,7 @@ public partial class MediaManager : IDisposable AddPlayedToEndObserver(); AddErrorObservers(); - WindowsChanged += OnWindowsChanged; + MediaManager.FullScreenEvents.WindowsChanged += OnWindowsChanged; return (Player, PlayerViewController); } @@ -694,10 +687,10 @@ sealed class MediaManagerDelegate : AVPlayerViewControllerDelegate { public override void WillBeginFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } public override void WillEndFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index f1530f0b63..4a7fb30c6c 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -9,7 +9,7 @@ #elif TIZEN global using PlatformMediaElement = CommunityToolkit.Maui.Core.Views.TizenPlayer; #endif - +using CommunityToolkit.Maui.Primitives; using Microsoft.Extensions.Logging; namespace CommunityToolkit.Maui.Core.Views; @@ -37,6 +37,22 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche Logger = MauiContext.Services.GetRequiredService().CreateLogger(nameof(MediaManager)); } + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + public record FullScreenEvents() + { + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + public static event EventHandler? WindowsChanged; + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + /// + public static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); + } + /// /// The instance managed by this manager. /// diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs index c00dd19eb8..b22c7d78a3 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs @@ -1,5 +1,4 @@ using CommunityToolkit.Maui.Core.Primitives; -using CommunityToolkit.Maui.Extensions; using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; @@ -58,7 +57,7 @@ public PlatformMediaElement CreatePlatformView() Player.MediaPlayer.IsMutedChanged += OnMediaElementIsMutedChanged; systemMediaControls = Player.MediaPlayer.SystemMediaTransportControls; - MauiMediaElement.WindowsChanged += OnWindowsChanged; + FullScreenEvents.WindowsChanged += OnWindowsChanged; return Player; } From 570668846a3a3a3bb9638e509a079bfcf0c23544 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 04:53:02 -0700 Subject: [PATCH 09/26] fix spacing issue --- .../Views/MauiMediaElement.android.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index cc1bd0b894..ccdb99825b 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -16,8 +16,6 @@ namespace CommunityToolkit.Maui.Core.Views; /// public class MauiMediaElement : CoordinatorLayout { - - readonly StyledPlayerView playerView; int defaultSystemUiVisibility; bool isSystemBarVisible; From 201e54ef1f38e5fd58a474a3afb04bdbcb2b1aec Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 05:40:04 -0700 Subject: [PATCH 10/26] Refactor full-screen state handling - Removed `OnWindowsChanged` from `MediaManager` in platform-specific files (Android, macOS, Windows) due to redundancy and centralized this logic by adding a new protected method `OnWindowsChanged` to the `FullScreenEvents` record in `MediaManager.shared.cs`. This change aims to reduce code duplication and improve the management of full-screen state changes across different platforms. --- .../Views/MediaManager.android.cs | 12 ------------ .../Views/MediaManager.macios.cs | 12 ------------ .../Views/MediaManager.shared.cs | 16 ++++++++++++++++ .../Views/MediaManager.windows.cs | 12 ------------ 4 files changed, 16 insertions(+), 36 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs index 421a0baa0b..61e65b6223 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs @@ -81,18 +81,6 @@ public partial class MediaManager : Java.Lang.Object, IPlayer.IListener } } - void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) - { - if (MediaElement is not null) - { - MediaElement.FullScreenChanged(e.NewState); - } - else - { - Logger?.LogWarning("MediaElement is null"); - } - } - /// /// Occurs when ExoPlayer changes the playback parameters. /// diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index a0b906344e..4bfe29ea22 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -136,18 +136,6 @@ public void Dispose() GC.SuppressFinalize(this); } - void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) - { - if (MediaElement is not null) - { - MediaElement.FullScreenChanged(e.NewState); - } - else - { - Logger?.LogWarning("MediaElement is null"); - } - } - protected virtual partial void PlatformPlay() { if (Player?.CurrentTime == PlayerItem?.Duration) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 4a7fb30c6c..059f685ea3 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -53,6 +53,22 @@ public record FullScreenEvents() public static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); } + /// + /// + /// + /// + /// + protected void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) + { + if (MediaElement is not null) + { + MediaElement.FullScreenChanged(e.NewState); + } + else + { + Logger?.LogWarning("MediaElement is null"); + } + } /// /// The instance managed by this manager. /// diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs index b22c7d78a3..0458dc137a 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs @@ -61,18 +61,6 @@ public PlatformMediaElement CreatePlatformView() return Player; } - void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) - { - if(MediaElement is not null) - { - MediaElement.FullScreenChanged(e.NewState); - } - else - { - Logger?.LogWarning("MediaElement is null"); - } - } - /// /// Releases the managed and unmanaged resources used by the . /// From 4a129069db74ca60e62c9cbb0a2f09eed51b2608 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 05:44:59 -0700 Subject: [PATCH 11/26] Centralize FullScreenEvents subscription Centralized the subscription to FullScreenEvents.WindowsChanged in the MediaManager class to improve maintainability and readability. Removed redundant event unsubscriptions in platform-specific MediaManager files, streamlining event management. --- .../Views/MediaManager.android.cs | 1 - .../Views/MediaManager.macios.cs | 2 -- .../Views/MediaManager.shared.cs | 1 + .../Views/MediaManager.windows.cs | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs index 61e65b6223..b59fde2508 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs @@ -199,7 +199,6 @@ or PlaybackStateCompat.StateSkippingToQueueItem ControllerAutoShow = false, LayoutParameters = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) }; - FullScreenEvents.WindowsChanged += OnWindowsChanged; checkPermissionsTask = CheckAndRequestForegroundPermission(checkPermissionSourceToken.Token); return (Player, PlayerView); } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index 4bfe29ea22..2d5fb5db71 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -122,8 +122,6 @@ public partial class MediaManager : IDisposable AddPlayedToEndObserver(); AddErrorObservers(); - MediaManager.FullScreenEvents.WindowsChanged += OnWindowsChanged; - return (Player, PlayerViewController); } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 059f685ea3..0a104ac57e 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -35,6 +35,7 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche Dispatcher = dispatcher; MediaElement = mediaElement; Logger = MauiContext.Services.GetRequiredService().CreateLogger(nameof(MediaManager)); + FullScreenEvents.WindowsChanged += OnWindowsChanged; } /// diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs index 0458dc137a..71b7097438 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs @@ -57,7 +57,6 @@ public PlatformMediaElement CreatePlatformView() Player.MediaPlayer.IsMutedChanged += OnMediaElementIsMutedChanged; systemMediaControls = Player.MediaPlayer.SystemMediaTransportControls; - FullScreenEvents.WindowsChanged += OnWindowsChanged; return Player; } From 3425c2538674c1fd8407defc5f84343064d29208 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 05:50:08 -0700 Subject: [PATCH 12/26] fix cosmetic issues --- .../Views/MediaManager.android.cs | 2 +- .../Views/MediaManager.shared.cs | 2 ++ .../Views/MediaManager.windows.cs | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs index b59fde2508..1899767566 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.android.cs @@ -18,7 +18,6 @@ using CommunityToolkit.Maui.ApplicationModel.Permissions; using CommunityToolkit.Maui.Core.Primitives; using CommunityToolkit.Maui.Media.Services; -using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; @@ -199,6 +198,7 @@ or PlaybackStateCompat.StateSkippingToQueueItem ControllerAutoShow = false, LayoutParameters = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent) }; + checkPermissionsTask = CheckAndRequestForegroundPermission(checkPermissionSourceToken.Token); return (Player, PlayerView); } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 0a104ac57e..08ca12d27d 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -9,6 +9,7 @@ #elif TIZEN global using PlatformMediaElement = CommunityToolkit.Maui.Core.Views.TizenPlayer; #endif + using CommunityToolkit.Maui.Primitives; using Microsoft.Extensions.Logging; @@ -34,6 +35,7 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche MauiContext = context; Dispatcher = dispatcher; MediaElement = mediaElement; + Logger = MauiContext.Services.GetRequiredService().CreateLogger(nameof(MediaManager)); FullScreenEvents.WindowsChanged += OnWindowsChanged; } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs index 71b7097438..6438581dc1 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.windows.cs @@ -1,5 +1,5 @@ using CommunityToolkit.Maui.Core.Primitives; -using CommunityToolkit.Maui.Primitives; +using CommunityToolkit.Maui.Extensions; using CommunityToolkit.Maui.Views; using Microsoft.Extensions.Logging; using Microsoft.UI.Xaml.Controls; @@ -46,6 +46,7 @@ public PlatformMediaElement CreatePlatformView() Player = new(); WindowsMediaElement MediaElement = new(); MediaElement.MediaOpened += OnMediaElementMediaOpened; + Player.SetMediaPlayer(MediaElement); Player.MediaPlayer.PlaybackSession.NaturalVideoSizeChanged += OnNaturalVideoSizeChanged; Player.MediaPlayer.PlaybackSession.PlaybackRateChanged += OnPlaybackSessionPlaybackRateChanged; From 7f757026bbe984e6524d9b00f47fe4489009cd70 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 05:56:21 -0700 Subject: [PATCH 13/26] More Cosmetic Fixes --- src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs | 4 +++- .../Views/MauiMediaElement.windows.cs | 2 -- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs b/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs index 58d7373aaf..ea4129d621 100644 --- a/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs @@ -39,7 +39,6 @@ public class MediaElement : View, IMediaElement, IDisposable BindableProperty.Create(nameof(FullScreenState), typeof(MediaElementScreenState), typeof(MediaElement), MediaElementScreenState.Default, propertyChanged: OnFullScreenPropertyChanged); - /// /// Backing store for the property. /// @@ -401,6 +400,7 @@ public MediaElementScreenState FullScreenState get => (MediaElementScreenState)GetValue(FullScreenProperty); private set => SetValue(FullScreenProperty, value); } + TimeSpan IMediaElement.Position { get => (TimeSpan)GetValue(PositionProperty); @@ -649,6 +649,7 @@ void IMediaElement.SeekCompleted() } void IMediaElement.CurrentStateChanged(MediaElementState newState) => CurrentState = newState; + void IMediaElement.FullScreenChanged(MediaElementScreenState newState) => FullScreenState = newState; void OnPositionChanged(MediaPositionChangedEventArgs mediaPositionChangedEventArgs) => @@ -659,6 +660,7 @@ void OnStateChanged(MediaStateChangedEventArgs mediaStateChangedEventArgs) => void OnFullScreenChanged(FullScreenStateChangedEventArgs fullScreenStateChangedEventArgs) => eventManager.HandleEvent(this, fullScreenStateChangedEventArgs, nameof(FullScreenStateChanged)); + void OnPauseRequested() => eventManager.HandleEvent(this, EventArgs.Empty, nameof(PauseRequested)); void OnPlayRequested() => eventManager.HandleEvent(this, EventArgs.Empty, nameof(PlayRequested)); diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index 4e5b0df22c..41bac769ac 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -33,7 +33,6 @@ public class MauiMediaElement : Grid, IDisposable // Cannot be static readonly because we need to be able to add icon to multiple instances of the button readonly FontIcon fullScreenIcon = new() { Glyph = "\uE740", FontFamily = new FontFamily("Segoe Fluent Icons") }; readonly FontIcon exitFullScreenIcon = new() { Glyph = "\uE73F", FontFamily = new FontFamily("Segoe Fluent Icons") }; - bool doesNavigationBarExistBeforeFullScreen; bool isDisposed; @@ -171,7 +170,6 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } else From 8bfed079393a3c3ecebee6c7d3431c9914a91cc6 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 06:25:23 -0700 Subject: [PATCH 14/26] Refactor full screen event handling - Renamed `OnWindowsChanged` to `OnFullScreenStatusChanged` in `MediaManager` and `FullScreenEvents` for clarity. - Added `MediaElement` property to `FullScreenEvents` for better media element access. --- .../Views/MediaManager.shared.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 08ca12d27d..81cd7a16d1 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -37,7 +37,7 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche MediaElement = mediaElement; Logger = MauiContext.Services.GetRequiredService().CreateLogger(nameof(MediaManager)); - FullScreenEvents.WindowsChanged += OnWindowsChanged; + FullScreenEvents.WindowsChanged += OnFullScreenStatusChanged; } /// @@ -61,7 +61,7 @@ public record FullScreenEvents() /// /// /// - protected void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs e) + protected void OnFullScreenStatusChanged(object? sender, FullScreenStateChangedEventArgs e) { if (MediaElement is not null) { @@ -72,6 +72,7 @@ protected void OnWindowsChanged(object? sender, FullScreenStateChangedEventArgs Logger?.LogWarning("MediaElement is null"); } } + /// /// The instance managed by this manager. /// From 58ffa61a42702572f815c2032cdd2ef864a44cc2 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 07:54:44 -0700 Subject: [PATCH 15/26] Increase accessibility and refine directives In `MauiMediaElement.android.cs`, the visibility of `CurrentPlatformContext` has been changed from `readonly` to `public readonly`, enhancing its accessibility for external use. Additionally, in `MediaManager.shared.cs`, a comment has been added to acknowledge similarities with PR #1918 on the CommunityToolkit/Maui repository. --- .../Views/MauiMediaElement.android.cs | 2 +- .../Views/MediaManager.shared.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index ccdb99825b..5c5214cbcf 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -192,7 +192,7 @@ void SetSystemBarsVisibility() } } - readonly record struct CurrentPlatformContext + public readonly record struct CurrentPlatformContext { public static Activity CurrentActivity { diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 81cd7a16d1..440a50f76d 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -1,4 +1,5 @@ -#if !(ANDROID || IOS || WINDOWS || MACCATALYST || TIZEN) +// NOTE: PR shares code with #1918 https://github.com/CommunityToolkit/Maui/pull/1918 +#if !(ANDROID || IOS || WINDOWS || MACCATALYST || TIZEN) global using PlatformMediaElement = System.Object; #elif ANDROID global using PlatformMediaElement = Com.Google.Android.Exoplayer2.IExoPlayer; From 1e65556e37da37e9ed23b64faba8811c3631d2c9 Mon Sep 17 00:00:00 2001 From: ne0rrmatrix Date: Fri, 19 Jul 2024 08:29:11 -0700 Subject: [PATCH 16/26] Refine visibility and structure of records - Changed `CurrentPlatformContext` in `MauiMediaElement.android.cs` from `public` to `internal`, limiting its accessibility to within its assembly. - Modified `FullScreenEvents` in `MediaManager.shared.cs`: 1. Access modifier updated from `public` to `internal`. 2. Converted from a `record` to a `readonly record struct`, making it a value type and immutable. --- .../Views/MauiMediaElement.android.cs | 2 +- .../Views/MediaManager.shared.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index 5c5214cbcf..f1d2539899 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -192,7 +192,7 @@ void SetSystemBarsVisibility() } } - public readonly record struct CurrentPlatformContext + internal readonly record struct CurrentPlatformContext { public static Activity CurrentActivity { diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 440a50f76d..f871605d73 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -44,7 +44,7 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche /// /// An event that is raised when the full screen state of the media element has changed. /// - public record FullScreenEvents() + internal readonly record struct FullScreenEvents() { /// /// An event that is raised when the full screen state of the media element has changed. From 94436e261f46aea2f2147d4c8507f0318152a497 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Mon, 20 Jan 2025 01:49:35 -0800 Subject: [PATCH 17/26] fix merge error --- .../Views/MauiMediaElement.android.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index 3da9ec40a0..15e653c5a3 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -6,6 +6,7 @@ using AndroidX.CoordinatorLayout.Widget; using AndroidX.Core.View; using AndroidX.Media3.UI; +using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; namespace CommunityToolkit.Maui.Core.Views; From bf5b70e7b628338f183ac37ab308ebe0a239a170 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Sun, 2 Feb 2025 17:40:56 -0800 Subject: [PATCH 18/26] Rename OnWindowsChanged to OnFullScreenStateChanged --- .../Views/MauiMediaElement.android.cs | 4 ++-- .../Views/MauiMediaElement.windows.cs | 4 ++-- .../Views/MediaManager.macios.cs | 4 ++-- .../Views/MediaManager.shared.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index 15e653c5a3..0ed0524630 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -121,14 +121,14 @@ void OnFullscreenButtonClick(object? sender, PlayerView.FullscreenButtonClickEve isFullScreen = true; RemoveView(relativeLayout); layout?.AddView(relativeLayout); - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } else { isFullScreen = false; layout?.RemoveView(relativeLayout); AddView(relativeLayout); - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } // Hide/Show the SystemBars and Status bar SetSystemBarsVisibility(); diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index 6485aaf026..4e04223b05 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -181,7 +181,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } else { @@ -208,7 +208,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) { popup.IsOpen = true; } - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index c47e624fb8..cfd41b9710 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -726,10 +726,10 @@ sealed class MediaManagerDelegate : AVPlayerViewControllerDelegate { public override void WillBeginFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } public override void WillEndFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.FullScreenEvents.OnWindowsChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index a0771b379d..c8c2f5c88a 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -54,7 +54,7 @@ internal readonly record struct FullScreenEvents() /// An event that is raised when the full screen state of the media element has changed. /// /// - public static void OnWindowsChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); + public static void OnFullScreenStateChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); } /// From 42b91a2ee9ada4f91aa7acfffab1db1d1605f13b Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Tue, 1 Apr 2025 14:25:50 -0700 Subject: [PATCH 19/26] Refactor full-screen event handling Updated full-screen state change handling to use a new static class `FullScreenEvents` instead of `MediaManager.FullScreenEvents`. This change centralizes event management across Android, Windows, and macOS, improving code organization and maintainability while preserving existing functionality. --- .../Primitives/FullScreenEvents.cs | 14 ++++++++++++++ .../Views/MauiMediaElement.android.cs | 4 ++-- .../Views/MauiMediaElement.windows.cs | 4 ++-- .../Views/MediaManager.macios.cs | 4 ++-- .../Views/MediaManager.shared.cs | 15 --------------- 5 files changed, 20 insertions(+), 21 deletions(-) create mode 100644 src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs new file mode 100644 index 0000000000..4e4977b97c --- /dev/null +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs @@ -0,0 +1,14 @@ +namespace CommunityToolkit.Maui.Primitives; + +static class FullScreenEvents +{ + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + public static event EventHandler? WindowsChanged; + /// + /// An event that is raised when the full screen state of the media element has changed. + /// + /// + public static void OnFullScreenStateChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); +} diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index fb49c1a341..3fae41dbc5 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -126,14 +126,14 @@ void OnFullscreenButtonClick(object? sender, PlayerView.FullscreenButtonClickEve isFullScreen = true; RemoveView(relativeLayout); layout?.AddView(relativeLayout); - MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } else { isFullScreen = false; layout?.RemoveView(relativeLayout); AddView(relativeLayout); - MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } // Hide/Show the SystemBars and Status bar SetSystemBarsVisibility(); diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index 4e04223b05..2e2c9ee013 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -181,7 +181,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; - MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } else { @@ -208,7 +208,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) { popup.IsOpen = true; } - MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index aff3f8c2a5..989ac26b1f 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -726,10 +726,10 @@ sealed class MediaManagerDelegate : AVPlayerViewControllerDelegate { public override void WillBeginFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } public override void WillEndFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index c8c2f5c88a..aea8a4394e 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -41,21 +41,6 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche FullScreenEvents.WindowsChanged += OnFullScreenStatusChanged; } - /// - /// An event that is raised when the full screen state of the media element has changed. - /// - internal readonly record struct FullScreenEvents() - { - /// - /// An event that is raised when the full screen state of the media element has changed. - /// - public static event EventHandler? WindowsChanged; - /// - /// An event that is raised when the full screen state of the media element has changed. - /// - /// - public static void OnFullScreenStateChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); - } /// /// From be5d58c4cb32582c5c1db5f09df7d2886c20fe97 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Sat, 5 Apr 2025 18:26:45 -0700 Subject: [PATCH 20/26] Refactor FullScreenEvents to use instance methods Updated the FullScreenEvents class to replace static event handling with instance methods, allowing for multiple instances and improved event management. Adjusted related calls in MauiMediaElement.android.cs and MauiMediaElement.windows.cs to use the new instance methods. Added a static instance of FullScreenEvents in MediaManager for centralized event management. --- .../Primitives/FullScreenEvents.cs | 14 ++++++++++---- .../Views/MauiMediaElement.android.cs | 4 ++-- .../Views/MauiMediaElement.windows.cs | 4 ++-- .../Views/MediaManager.macios.cs | 4 ++-- .../Views/MediaManager.shared.cs | 4 ++++ 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs index 4e4977b97c..5b089cade6 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs @@ -1,14 +1,20 @@ -namespace CommunityToolkit.Maui.Primitives; +using CommunityToolkit.Maui.Views; -static class FullScreenEvents +namespace CommunityToolkit.Maui.Primitives; + +/// +/// Represents the event arguments for the event. +/// +public class FullScreenEvents { /// /// An event that is raised when the full screen state of the media element has changed. /// - public static event EventHandler? WindowsChanged; + public event EventHandler? WindowsChanged; /// /// An event that is raised when the full screen state of the media element has changed. /// + /// /// - public static void OnFullScreenStateChanged(FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(null, e); + public void OnFullScreenStateChanged(object? sender, FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(sender, e); } diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index 3fae41dbc5..626332453b 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -126,14 +126,14 @@ void OnFullscreenButtonClick(object? sender, PlayerView.FullscreenButtonClickEve isFullScreen = true; RemoveView(relativeLayout); layout?.AddView(relativeLayout); - FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } else { isFullScreen = false; layout?.RemoveView(relativeLayout); AddView(relativeLayout); - FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(this , new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } // Hide/Show the SystemBars and Status bar SetSystemBarsVisibility(); diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index 2e2c9ee013..c3119ec61b 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -181,7 +181,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; - FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } else { @@ -208,7 +208,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) { popup.IsOpen = true; } - FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index 989ac26b1f..d3bdcd352c 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -726,10 +726,10 @@ sealed class MediaManagerDelegate : AVPlayerViewControllerDelegate { public override void WillBeginFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); } public override void WillEndFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - FullScreenEvents.OnFullScreenStateChanged(new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index aea8a4394e..51e68f5d72 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -21,6 +21,10 @@ namespace CommunityToolkit.Maui.Core.Views; /// public partial class MediaManager { + /// + /// The instance that is managed through this class. + /// + public static readonly FullScreenEvents FullScreenEvents = new(); /// /// Initializes a new instance of the class. /// From d1a8df90d3647749df3e238eb4e0789a3c9e1b0d Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Thu, 3 Jul 2025 13:25:17 -0700 Subject: [PATCH 21/26] Update comment for MediaElementScreenState enum Revised the comment above the `MediaElementScreenState` enum to clarify its purpose, changing it to "Represents the different screen states of a media element." --- .../Primitives/MediaElementFullScreenState.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs index d0ec40e7be..e20b922b75 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/MediaElementFullScreenState.cs @@ -1,7 +1,7 @@ namespace CommunityToolkit.Maui.Core; /// -/// +/// Represents the different screen states of a media element. /// public enum MediaElementScreenState { From ba9936ea6166e37dce47e428fecab3866053c240 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Thu, 3 Jul 2025 13:26:31 -0700 Subject: [PATCH 22/26] Improve comment for OnFullScreenStatusChanged method Updated the comment above the `OnFullScreenStatusChanged` method to clarify its purpose. The original comment was removed and replaced with a more descriptive statement: "Handles changes to the full screen state." --- .../Views/MediaManager.shared.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 51e68f5d72..5f3f10ad1f 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -47,7 +47,7 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche /// - /// + /// Handles changes to the full screen state. /// /// /// From 5a5675c96c0c8f29f27129465e295d862c987dc6 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Fri, 5 Sep 2025 12:06:22 -0700 Subject: [PATCH 23/26] Fix variable case --- src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs b/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs index 9e5c64beee..f707995af8 100644 --- a/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs @@ -555,11 +555,11 @@ static void OnSourcePropertyChanging(BindableObject bindable, object oldValue, o static void OnFullScreenPropertyChanged(BindableObject bindable, object oldValue, object newValue) { - var MediaElement = (MediaElement)bindable; + var mediaElement = (MediaElement)bindable; var previousState = (MediaElementScreenState)oldValue; var newState = (MediaElementScreenState)newValue; - MediaElement.OnFullScreenChanged(new FullScreenStateChangedEventArgs(previousState, newState)); + mediaElement.OnFullScreenChanged(new FullScreenStateChangedEventArgs(previousState, newState)); } static void OnCurrentStatePropertyChanged(BindableObject bindable, object oldValue, object newValue) From 427e31f9882728f1dde7c27edc7a4132cde0c22b Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Fri, 5 Sep 2025 12:51:49 -0700 Subject: [PATCH 24/26] Update FullScreenEvents to use WeakEventManager --- .../Primitives/FullScreenEvents.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs index 987577bc28..2e52cb99b9 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs @@ -1,5 +1,4 @@ using CommunityToolkit.Maui.Core; -using CommunityToolkit.Maui.Views; namespace CommunityToolkit.Maui.Primitives; @@ -8,14 +7,22 @@ namespace CommunityToolkit.Maui.Primitives; /// public class FullScreenEvents { + readonly WeakEventManager eventManager = new(); + /// - /// An event that is raised when the full screen state of the media element has changed. + /// Raised when the full screen state of the media element changes. /// - public event EventHandler? WindowsChanged; + public event EventHandler WindowsChanged + { + add => eventManager.AddEventHandler(value); + remove => eventManager.RemoveEventHandler(value); + } + /// - /// An event that is raised when the full screen state of the media element has changed. + /// Triggers the event. /// - /// - /// - public void OnFullScreenStateChanged(object? sender, FullScreenStateChangedEventArgs e) => WindowsChanged?.Invoke(sender, e); + /// Origin of the event. + /// Full screen state change arguments. + public void OnFullScreenStateChanged(object? sender, FullScreenStateChangedEventArgs e) => + eventManager.HandleEvent(sender, e, nameof(WindowsChanged)); } From eee4a1991eebe2beb8d2b3bfa33fd80d33a16382 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Fri, 5 Sep 2025 13:35:09 -0700 Subject: [PATCH 25/26] Removed public static event and FullScreenEvents. Updated with better event handling. --- .../Handlers/MediaElementHandler.android.cs | 2 +- .../Handlers/MediaElementHandler.windows.cs | 2 +- .../Primitives/FullScreenEvents.cs | 28 ------------------- .../Views/MauiMediaElement.android.cs | 10 ++++--- .../Views/MauiMediaElement.windows.cs | 9 ++++-- .../Views/MediaManager.macios.cs | 10 ++++--- .../Views/MediaManager.shared.cs | 23 +++------------ 7 files changed, 24 insertions(+), 60 deletions(-) delete mode 100644 src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs diff --git a/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.android.cs b/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.android.cs index bd1e00e6e7..1cc281b6bf 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.android.cs @@ -25,7 +25,7 @@ protected override MauiMediaElement CreatePlatformView() Dispatcher.GetForCurrentThread() ?? throw new InvalidOperationException($"{nameof(IDispatcher)} cannot be null")); var (_, playerView) = MediaManager.CreatePlatformView(VirtualView.AndroidViewType); - return new(Context, playerView); + return new(Context, playerView, MediaManager); } protected override void DisconnectHandler(MauiMediaElement platformView) diff --git a/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.windows.cs index bbc29f0064..3280c612a2 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHandler.windows.cs @@ -25,7 +25,7 @@ protected override MauiMediaElement CreatePlatformView() Dispatcher.GetForCurrentThread() ?? throw new InvalidOperationException($"{nameof(IDispatcher)} cannot be null")); var mediaPlatform = MediaManager.CreatePlatformView(); - return new(mediaPlatform); + return new(mediaPlatform, MediaManager); } /// diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs deleted file mode 100644 index 2e52cb99b9..0000000000 --- a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenEvents.cs +++ /dev/null @@ -1,28 +0,0 @@ -using CommunityToolkit.Maui.Core; - -namespace CommunityToolkit.Maui.Primitives; - -/// -/// Represents the event arguments for the event. -/// -public class FullScreenEvents -{ - readonly WeakEventManager eventManager = new(); - - /// - /// Raised when the full screen state of the media element changes. - /// - public event EventHandler WindowsChanged - { - add => eventManager.AddEventHandler(value); - remove => eventManager.RemoveEventHandler(value); - } - - /// - /// Triggers the event. - /// - /// Origin of the event. - /// Full screen state change arguments. - public void OnFullScreenStateChanged(object? sender, FullScreenStateChangedEventArgs e) => - eventManager.HandleEvent(sender, e, nameof(WindowsChanged)); -} diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs index 80953c3479..a340a57bfd 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.android.cs @@ -6,7 +6,6 @@ using AndroidX.CoordinatorLayout.Widget; using AndroidX.Core.View; using AndroidX.Media3.UI; -using CommunityToolkit.Maui.Primitives; using CommunityToolkit.Maui.Views; [assembly: UsesPermission(Android.Manifest.Permission.ForegroundServiceMediaPlayback)] @@ -23,6 +22,7 @@ public class MauiMediaElement : CoordinatorLayout { readonly RelativeLayout relativeLayout; readonly PlayerView playerView; + readonly MediaManager mediaManager; int defaultSystemUiVisibility; bool isSystemBarVisible; @@ -42,9 +42,11 @@ public MauiMediaElement(nint ptr, JniHandleOwnership jni) : base(Platform.AppCon /// /// The application's . /// The that acts as the platform media player. - public MauiMediaElement(Context context, PlayerView playerView) : base(context) + /// The that is managing the instance. + public MauiMediaElement(Context context, PlayerView playerView, MediaManager mediaManager) : base(context) { this.playerView = playerView; + this.mediaManager = mediaManager ?? throw new ArgumentNullException(nameof(mediaManager)); this.playerView.SetBackgroundColor(Android.Graphics.Color.Black); playerView.FullscreenButtonClick += OnFullscreenButtonClick; var layout = new RelativeLayout.LayoutParams(LayoutParams.WrapContent, LayoutParams.WrapContent); @@ -126,14 +128,14 @@ void OnFullscreenButtonClick(object? sender, PlayerView.FullscreenButtonClickEve isFullScreen = true; RemoveView(relativeLayout); layout?.AddView(relativeLayout); - MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + mediaManager.UpdateFullScreenState(MediaElementScreenState.FullScreen); } else { isFullScreen = false; layout?.RemoveView(relativeLayout); AddView(relativeLayout); - MediaManager.FullScreenEvents.OnFullScreenStateChanged(this , new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + mediaManager.UpdateFullScreenState(MediaElementScreenState.Default); } // Hide/Show the SystemBars and Status bar SetSystemBarsVisibility(); diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs index c3119ec61b..4f777d8178 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs @@ -24,6 +24,7 @@ public partial class MauiMediaElement : Grid, IDisposable readonly Popup popup = new(); readonly Grid fullScreenGrid = new(); readonly MediaPlayerElement mediaPlayerElement; + readonly MediaManager mediaManager; readonly CustomTransportControls? customTransportControls; bool doesNavigationBarExistBeforeFullScreen; bool isDisposed; @@ -32,9 +33,11 @@ public partial class MauiMediaElement : Grid, IDisposable /// Initializes a new instance of the class. /// /// - public MauiMediaElement(MediaPlayerElement mediaPlayerElement) + /// + public MauiMediaElement(MediaPlayerElement mediaPlayerElement, MediaManager mediaManager) { LoadResourceDictionary(); + this.mediaManager = mediaManager; this.mediaPlayerElement = mediaPlayerElement; customTransportControls = SetTransportControls(); Children.Add(this.mediaPlayerElement); @@ -181,7 +184,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) var parent = mediaPlayerElement.Parent as FrameworkElement; mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width; mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height; - MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + mediaManager.UpdateFullScreenState(MediaElementScreenState.Default); } else { @@ -208,7 +211,7 @@ void OnFullScreenButtonClick(object sender, RoutedEventArgs e) { popup.IsOpen = true; } - MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + mediaManager.UpdateFullScreenState(MediaElementScreenState.FullScreen); } } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs index b1167aa258..67ff64636d 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.macios.cs @@ -29,7 +29,7 @@ public partial class MediaManager : IDisposable PlayerViewController = new() { Player = Player, - Delegate = new MediaManagerDelegate() + Delegate = new MediaManagerDelegate(this) }; // Pre-initialize Volume and Muted properties to the player object @@ -720,14 +720,16 @@ void RateChanged(object? sender, NSNotificationEventArgs args) } } -sealed class MediaManagerDelegate : AVPlayerViewControllerDelegate +sealed class MediaManagerDelegate(MediaManager mediaManager) : AVPlayerViewControllerDelegate { + readonly MediaManager mediaManager = mediaManager; + public override void WillBeginFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.Default, MediaElementScreenState.FullScreen)); + mediaManager.UpdateFullScreenState(MediaElementScreenState.FullScreen); } public override void WillEndFullScreenPresentation(AVPlayerViewController playerViewController, IUIViewControllerTransitionCoordinator coordinator) { - MediaManager.FullScreenEvents.OnFullScreenStateChanged(this, new FullScreenStateChangedEventArgs(MediaElementScreenState.FullScreen, MediaElementScreenState.Default)); + mediaManager.UpdateFullScreenState(MediaElementScreenState.Default); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs index 5f3f10ad1f..227e539385 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shared.cs @@ -11,7 +11,6 @@ global using PlatformMediaElement = CommunityToolkit.Maui.Core.Views.TizenPlayer; #endif -using CommunityToolkit.Maui.Primitives; using Microsoft.Extensions.Logging; namespace CommunityToolkit.Maui.Core.Views; @@ -21,10 +20,6 @@ namespace CommunityToolkit.Maui.Core.Views; /// public partial class MediaManager { - /// - /// The instance that is managed through this class. - /// - public static readonly FullScreenEvents FullScreenEvents = new(); /// /// Initializes a new instance of the class. /// @@ -42,25 +37,15 @@ public MediaManager(IMauiContext context, IMediaElement mediaElement, IDispatche MediaElement = mediaElement; Logger = MauiContext.Services.GetRequiredService().CreateLogger(nameof(MediaManager)); - FullScreenEvents.WindowsChanged += OnFullScreenStatusChanged; } - /// - /// Handles changes to the full screen state. + /// Update the full screen state on the associated MediaElement. /// - /// - /// - protected void OnFullScreenStatusChanged(object? sender, FullScreenStateChangedEventArgs e) + /// The new full screen state. + internal void UpdateFullScreenState(MediaElementScreenState newState) { - if (MediaElement is not null) - { - MediaElement.FullScreenChanged(e.NewState); - } - else - { - Logger?.LogWarning("MediaElement is null"); - } + MediaElement.FullScreenChanged(newState); } /// From 073a2bd4092ef302c7a78f2a171a26f12fcbf819 Mon Sep 17 00:00:00 2001 From: James Crutchley Date: Fri, 5 Sep 2025 13:41:32 -0700 Subject: [PATCH 26/26] Updated `FullScreenStateChangedEventArgs` to inherit from `EventArgs` --- .../FullScreenStateChangedEventArgs.cs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs index b927e8cf8b..2bd99a962b 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/FullScreenStateChangedEventArgs.cs @@ -3,26 +3,21 @@ /// /// Event data for when the full screen state of the media element has changed. /// -public sealed class FullScreenStateChangedEventArgs +/// +/// Initializes a new instance of the class. +/// +/// +/// +public sealed class FullScreenStateChangedEventArgs(MediaElementScreenState previousState, MediaElementScreenState newState) : EventArgs { - /// - /// Initializes a new instance of the class. - /// - /// - /// - public FullScreenStateChangedEventArgs(MediaElementScreenState previousState, MediaElementScreenState newState) - { - PreviousState = previousState; - NewState = newState; - } /// /// Gets the previous state that the instance is transitioning from. /// - public MediaElementScreenState PreviousState { get; } + public MediaElementScreenState PreviousState { get; } = previousState; /// /// Gets the new state that the instance is transitioning to. /// - public MediaElementScreenState NewState { get; } + public MediaElementScreenState NewState { get; } = newState; }