Skip to content
Open
Show file tree
Hide file tree
Changes from 138 commits
Commits
Show all changes
146 commits
Select commit Hold shift + click to select a range
bba92d1
Add full screen state management for media elements
ne0rrmatrix May 24, 2024
2aaa53e
Merge Main into FullScreenEvents
ne0rrmatrix Jun 16, 2024
6db6b06
fix merge bug
ne0rrmatrix Jun 16, 2024
17601c3
Enhance fullscreen event handling
ne0rrmatrix Jun 16, 2024
7669d0a
fix fullscreen event handling macios
ne0rrmatrix Jun 16, 2024
38c5834
Update comment for OnWindowsChanged event
ne0rrmatrix Jun 16, 2024
2783077
Merge branch 'CommunityToolkit:main' into FullScreenEvents
ne0rrmatrix Jun 17, 2024
47b6434
Merge branch 'CommunityToolkit:main' into FullScreenEvents
ne0rrmatrix Jun 24, 2024
5185222
Merge Main into FullScreenEvents
ne0rrmatrix Jul 11, 2024
8198c94
fix merge errror
ne0rrmatrix Jul 11, 2024
6d34192
Fix another merge error
ne0rrmatrix Jul 11, 2024
d7c12eb
Merge branch 'FullScreenEvents' of https://github.com/ne0rrmatrix/Mau…
ne0rrmatrix Jul 11, 2024
afa937f
Merge branch 'CommunityToolkit:main' into FullScreenEvents
ne0rrmatrix Jul 19, 2024
6c8b106
Refactor full-screen event handling
ne0rrmatrix Jul 19, 2024
697950d
Merge branch 'FullScreenEvents' of https://github.com/ne0rrmatrix/Mau…
ne0rrmatrix Jul 19, 2024
5706688
fix spacing issue
ne0rrmatrix Jul 19, 2024
201e54e
Refactor full-screen state handling
ne0rrmatrix Jul 19, 2024
4a12906
Centralize FullScreenEvents subscription
ne0rrmatrix Jul 19, 2024
3425c25
fix cosmetic issues
ne0rrmatrix Jul 19, 2024
7f75702
More Cosmetic Fixes
ne0rrmatrix Jul 19, 2024
8bfed07
Refactor full screen event handling
ne0rrmatrix Jul 19, 2024
58ffa61
Increase accessibility and refine directives
ne0rrmatrix Jul 19, 2024
1e65556
Refine visibility and structure of records
ne0rrmatrix Jul 19, 2024
4abb02c
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 22, 2024
63bf581
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 24, 2024
b43ccfa
Merge branch 'main' into FullScreenEvents
TheCodeTraveler Jul 24, 2024
f1c1ae6
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 25, 2024
f9a516c
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 2, 2024
fa8e9fb
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 3, 2024
fddb7f6
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 4, 2024
aa09b29
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 8, 2024
2f6c67e
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 9, 2024
de01200
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 9, 2024
ba378b9
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 10, 2024
69714db
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 16, 2024
6dba9bb
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 19, 2024
c3322fa
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 19, 2024
72bc9da
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 22, 2024
279cd7f
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Sep 2, 2024
2bb21dd
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Sep 5, 2024
ebe0d60
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Sep 10, 2024
142544c
Merge branch 'CommunityToolkit:main' into FullScreenEvents
ne0rrmatrix Sep 11, 2024
112e7e5
Merge branch 'CommunityToolkit:main' into FullScreenEvents
ne0rrmatrix Sep 16, 2024
5ffabb7
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Sep 24, 2024
ee8868a
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Sep 27, 2024
1684f86
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 1, 2024
d1bebfd
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 10, 2024
1590fe1
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 15, 2024
a0e47d7
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 16, 2024
f585895
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 20, 2024
2a6f156
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 31, 2024
2b35903
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 5, 2024
b72c39e
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 7, 2024
a5028d2
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 11, 2024
9ce744b
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 11, 2024
6f94766
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Dec 2, 2024
c841e3c
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Dec 12, 2024
33f44ba
Merge branch 'main' into FullScreenEvents
TheCodeTraveler Dec 18, 2024
dfa7af1
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Dec 19, 2024
8bdb8a9
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Dec 20, 2024
692c286
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Dec 28, 2024
59e7e1c
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jan 3, 2025
b26bb60
Fix Merge Confilicts
ne0rrmatrix Jan 20, 2025
94436e2
fix merge error
ne0rrmatrix Jan 20, 2025
77878ed
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jan 21, 2025
4367ea1
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jan 22, 2025
8687ea0
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jan 23, 2025
f82392d
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jan 24, 2025
93dbdc2
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 3, 2025
bf5b70e
Rename OnWindowsChanged to OnFullScreenStateChanged
ne0rrmatrix Feb 3, 2025
4867fa6
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 3, 2025
05be19c
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 4, 2025
06b2a1e
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 4, 2025
621840b
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 9, 2025
44c0afa
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 10, 2025
e8adc95
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 12, 2025
19f9526
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 13, 2025
45580dd
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Feb 15, 2025
9a38eb3
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 7, 2025
8388539
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 15, 2025
6d98bdf
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Apr 1, 2025
42b91a2
Refactor full-screen event handling
ne0rrmatrix Apr 1, 2025
e513a81
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Apr 5, 2025
be5d58c
Refactor FullScreenEvents to use instance methods
ne0rrmatrix Apr 6, 2025
72a8769
Merge branch 'FullScreenEvents' of https://github.com/ne0rrmatrix/Mau…
ne0rrmatrix Apr 6, 2025
fe1d20d
Merge branch 'main' into FullScreenEvents
TheCodeTraveler Apr 12, 2025
2ae03fb
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Apr 25, 2025
637dfbc
Fix Merge Conflict
ne0rrmatrix May 4, 2025
f7beb35
Merge branch 'main' into FullScreenEvents
ne0rrmatrix May 7, 2025
f2d2d04
Merge branch 'main' into FullScreenEvents
ne0rrmatrix May 27, 2025
93a534e
Merge branch 'main' into FullScreenEvents
ne0rrmatrix May 29, 2025
d63101f
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jun 3, 2025
84774e8
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jun 8, 2025
779d8d9
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jun 20, 2025
83acf53
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jun 25, 2025
826259f
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 3, 2025
d1a8df9
Update comment for MediaElementScreenState enum
ne0rrmatrix Jul 3, 2025
ba9936e
Improve comment for OnFullScreenStatusChanged method
ne0rrmatrix Jul 3, 2025
95d59fd
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 3, 2025
7669c1d
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 3, 2025
8887d07
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 3, 2025
fc46ed6
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 8, 2025
825b675
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Jul 30, 2025
eba43a3
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Aug 3, 2025
726a54b
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Sep 5, 2025
5a5675c
Fix variable case
ne0rrmatrix Sep 5, 2025
427e31f
Update FullScreenEvents to use WeakEventManager
ne0rrmatrix Sep 5, 2025
eee4a19
Removed public static event and FullScreenEvents. Updated with better…
ne0rrmatrix Sep 5, 2025
073a2bd
Updated `FullScreenStateChangedEventArgs` to inherit from `EventArgs`
ne0rrmatrix Sep 5, 2025
79210ce
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 2, 2025
37cd87a
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Oct 16, 2025
8aef539
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 5, 2025
dfb8233
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 20, 2025
c04ee86
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 23, 2025
fb4ec2c
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Nov 24, 2025
22fa889
Fix merge
ne0rrmatrix Feb 12, 2026
4c1368c
fix merge conflict
ne0rrmatrix Feb 17, 2026
089c117
fix merge conflict
ne0rrmatrix Feb 17, 2026
63bfdd4
Switch to using event handlers for Full Screen Events
ne0rrmatrix Feb 17, 2026
ba5d9be
Refactor FullScreenButtonClicked event handling
ne0rrmatrix Feb 17, 2026
d3d8028
Update src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHa…
ne0rrmatrix Feb 17, 2026
cbc8b71
Update src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.shar…
ne0rrmatrix Feb 17, 2026
f6eab31
Fixes
ne0rrmatrix Feb 17, 2026
12bf3b3
More Fixes
ne0rrmatrix Feb 17, 2026
41a0006
Add Tets for MediaElementScreenState
ne0rrmatrix Feb 17, 2026
e1092b3
Update src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHa…
ne0rrmatrix Feb 17, 2026
bca8914
Update src/CommunityToolkit.Maui.MediaElement/Interfaces/IMediaElemen…
ne0rrmatrix Feb 17, 2026
8b63297
Update src/CommunityToolkit.Maui.MediaElement/Interfaces/IMediaElemen…
ne0rrmatrix Feb 17, 2026
0fc8b1a
Update tests
ne0rrmatrix Feb 17, 2026
aefaba3
Standardize full-screen event to FullScreenStateChanged
ne0rrmatrix Feb 17, 2026
8583387
Rename FullScreenStateChanged to ScreenStateChanged
ne0rrmatrix Feb 17, 2026
0f3a264
Update src/CommunityToolkit.Maui.MediaElement/Primitives/ScreenStateC…
ne0rrmatrix Feb 17, 2026
5c42fe2
Update src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.…
ne0rrmatrix Feb 18, 2026
a340b30
Update src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.maci…
ne0rrmatrix Feb 18, 2026
8556412
Update src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHa…
ne0rrmatrix Feb 18, 2026
ef27390
Update src/CommunityToolkit.Maui.MediaElement/Views/MediaManager.wind…
ne0rrmatrix Feb 18, 2026
27d6e99
Update src/CommunityToolkit.Maui.MediaElement/Handlers/MediaElementHa…
ne0rrmatrix Feb 18, 2026
2d3ac0c
Update src/CommunityToolkit.Maui.UnitTests/Views/MediaElement/MediaEl…
ne0rrmatrix Feb 18, 2026
8878c83
Rename FullScreenState to ScreenState in MediaElement
ne0rrmatrix Feb 18, 2026
172ebe7
Merge branch 'FullScreenEvents' of https://github.com/ne0rrmatrix/Mau…
ne0rrmatrix Feb 18, 2026
735cc47
Refactor: remove nullable checks for mediaElementState
ne0rrmatrix Feb 18, 2026
6171b1b
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 8, 2026
d46eaec
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 11, 2026
c807eff
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 12, 2026
46c71bc
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 21, 2026
8790d1e
Merge branch 'main' into FullScreenEvents
ne0rrmatrix Mar 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
MediaOpened="OnMediaOpened"
PositionChanged="OnPositionChanged"
StateChanged="OnStateChanged"
SeekCompleted="OnSeekCompleted"/>
SeekCompleted="OnSeekCompleted"
ScreenStateChanged="MediaElement_FullScreenStateChanged"/>
<HorizontalStackLayout Grid.Row="1" Padding="0,0,0,15">
<Label HorizontalOptions="Center" x:DataType="toolkit:MediaElement">
<Label.Text>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public MediaElementPage(MediaElementViewModel viewModel, IFileSystem fileSystem,
MediaElement.PropertyChanged += MediaElement_PropertyChanged;
}

void MediaElement_FullScreenStateChanged(object? sender, ScreenStateChangedEventArgs e) =>
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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,24 @@ protected override MauiMediaElement CreatePlatformView()
return new(Context, playerView);
}

protected override void ConnectHandler(MauiMediaElement platformView)
{
platformView.FullScreenStateChanged += OnScreenStateChanged;
base.ConnectHandler(platformView);
}

void OnScreenStateChanged(object? sender, ScreenStateChangedEventArgs e)
{
MediaManager?.UpdateFullScreenState(e.NewState);
}
/// <summary>
/// Disconnects the handler from the platform-specific <see cref="MauiMediaElement"/> and
/// unsubscribes from related events, disposing the platform view and handler resources.
/// </summary>
/// <param name="platformView">The platform-specific <see cref="MauiMediaElement"/> instance to disconnect.</param>
protected override void DisconnectHandler(MauiMediaElement platformView)
{
platformView.FullScreenStateChanged -= OnScreenStateChanged;
platformView.Dispose();
Dispose();
base.DisconnectHandler(platformView);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,27 @@ protected override MauiMediaElement CreatePlatformView()
return new(mediaPlatform);
}

/// <summary>
/// Establishes a connection between the handler and the specified platform-specific media element view.
/// </summary>
/// <remarks>Overrides the base implementation to provide custom connection logic for the media element on the
/// Windows platform.</remarks>
/// <param name="platformView">The platform-specific media element view to connect to the handler. Cannot be null.</param>
protected override void ConnectHandler(MauiMediaElement platformView)
{
platformView.FullScreenStateChanged += OnScreenStateChanged;
base.ConnectHandler(platformView);
}

void OnScreenStateChanged(object? sender, ScreenStateChangedEventArgs e)
{
MediaManager?.UpdateFullScreenState(e.NewState);
}

/// <inheritdoc/>
protected override void DisconnectHandler(MauiMediaElement platformView)
{
platformView.FullScreenStateChanged -= OnScreenStateChanged;
Dispose();
UnloadPlatformView(platformView);
base.DisconnectHandler(platformView);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ public interface IMediaElement : IView, IAsynchronousMediaElementHandler
/// </summary>
MediaElementState CurrentState { get; }

/// <summary>
/// Gets the full screen state of the media element.
/// </summary>
MediaElementScreenState FullScreenState { get; }

/// <summary>
/// Gets the height (in pixels) of the loaded media in pixels.
/// </summary>
Expand Down Expand Up @@ -111,6 +116,11 @@ public interface IMediaElement : IView, IAsynchronousMediaElementHandler
/// </summary>
string MetadataArtworkUrl { get; set; }

/// <summary>
/// Occurs when the <see cref="FullScreenState"/> changes.
/// </summary>
event EventHandler<ScreenStateChangedEventArgs> ScreenStateChanged;

/// <summary>
/// Occurs when the media has ended playing successfully.
/// </summary>
Expand Down Expand Up @@ -161,4 +171,10 @@ public interface IMediaElement : IView, IAsynchronousMediaElementHandler
/// </summary>
/// <param name="newState">The new state the <see cref="MediaElement"/> transitioned to.</param>
internal void CurrentStateChanged(MediaElementState newState);

/// <summary>
/// Triggers a <see cref="FullScreenState"/> change. Intended to be called by platform-specific handlers or managers when the fullscreen state changes.
/// </summary>
/// <param name="newState">The new fullscreen state the <see cref="MediaElement"/> transitioned to.</param>
internal void FullScreenChanged(MediaElementScreenState newState);
}
40 changes: 39 additions & 1 deletion src/CommunityToolkit.Maui.MediaElement/MediaElement.shared.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,16 @@ public partial class MediaElement : View, IMediaElement, IDisposable
/// </summary>
public static readonly BindableProperty DurationProperty = durationPropertyKey.BindableProperty;

static readonly BindablePropertyKey screenStatePropertyKey =
BindableProperty.CreateReadOnly(nameof(FullScreenState), typeof(MediaElementScreenState), typeof(MediaElement),
MediaElementScreenState.Default, propertyChanged: OnFullScreenPropertyChanged);
/// <summary>
/// Bindable property for the <see cref="ShouldAutoPlay"/> property.
/// Backing store for the <see cref="FullScreenState"/> property.
/// </summary>
public static readonly BindableProperty ScreenStateProperty = screenStatePropertyKey.BindableProperty;

/// <summary>
/// Backing store for the <see cref="ShouldAutoPlay"/> property.
/// </summary>
public static readonly BindableProperty ShouldAutoPlayProperty =
BindableProperty.Create(nameof(ShouldAutoPlay), typeof(bool), typeof(MediaElement), MediaElementDefaults.ShouldAutoPlay);
Expand Down Expand Up @@ -161,6 +169,13 @@ public event EventHandler SeekCompleted
remove => eventManager.RemoveEventHandler(value);
}

/// <inheritdoc cref="IMediaElement.ScreenStateChanged"/>
public event EventHandler<ScreenStateChangedEventArgs> ScreenStateChanged
{
add => eventManager.AddEventHandler(value);
remove => eventManager.RemoveEventHandler(value);
}

/// <inheritdoc cref="IMediaElement.StateChanged"/>
public event EventHandler<MediaStateChangedEventArgs> StateChanged
{
Expand Down Expand Up @@ -371,6 +386,15 @@ public MediaElementState CurrentState
private set => SetValue(currentStatePropertyKey, value);
}

/// <summary>
/// Gets the full screen state of the media element.
/// </summary>
public MediaElementScreenState FullScreenState
{
get => (MediaElementScreenState)GetValue(ScreenStateProperty);
private set => SetValue(screenStatePropertyKey, value);
}

/// <inheritdoc/>
TaskCompletionSource IAsynchronousMediaElementHandler.SeekCompletedTCS => seekCompletedTaskCompletionSource;

Expand Down Expand Up @@ -527,6 +551,15 @@ static void OnSourcePropertyChanging(BindableObject bindable, object oldValue, o
oldMediaSource?.SourceChanged -= mediaElement.OnSourceChanged;
}

static void OnFullScreenPropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var mediaElement = (MediaElement)bindable;
var previousState = (MediaElementScreenState)oldValue;
var newState = (MediaElementScreenState)newValue;

mediaElement.OnFullScreenChanged(new ScreenStateChangedEventArgs(previousState, newState));
}

static void OnCurrentStatePropertyChanged(BindableObject bindable, object oldValue, object newValue)
{
var mediaElement = (MediaElement)bindable;
Expand Down Expand Up @@ -584,12 +617,17 @@ void OnSourceChanged(object? sender, EventArgs eventArgs)
InvalidateMeasure();
}

void IMediaElement.FullScreenChanged(MediaElementScreenState newState) => FullScreenState = newState;

void OnPositionChanged(MediaPositionChangedEventArgs mediaPositionChangedEventArgs) =>
eventManager.HandleEvent(this, mediaPositionChangedEventArgs, nameof(PositionChanged));

void OnStateChanged(MediaStateChangedEventArgs mediaStateChangedEventArgs) =>
eventManager.HandleEvent(this, mediaStateChangedEventArgs, nameof(StateChanged));

void OnFullScreenChanged(ScreenStateChangedEventArgs fullScreenStateChangedEventArgs) =>
eventManager.HandleEvent(this, fullScreenStateChangedEventArgs, nameof(ScreenStateChanged));

void OnPauseRequested() => eventManager.HandleEvent(this, EventArgs.Empty, nameof(PauseRequested));

void OnPlayRequested() => eventManager.HandleEvent(this, EventArgs.Empty, nameof(PlayRequested));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace CommunityToolkit.Maui.Core;

/// <summary>
/// Represents the different screen states of a media element.
/// </summary>
public enum MediaElementScreenState
{
/// <summary>
/// The default state.
/// </summary>
Default = 0,

/// <summary>
/// Full screen.
/// </summary>
FullScreen = 1,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
namespace CommunityToolkit.Maui.Core;

/// <summary>
/// Event data for when the full screen state of the media element has changed.
/// </summary>
/// <remarks>
/// Initializes a new instance of the <see cref="ScreenStateChangedEventArgs"/> class.
/// </remarks>
/// <param name="previousState"></param>
/// <param name="newState"></param>
public sealed class ScreenStateChangedEventArgs(MediaElementScreenState previousState, MediaElementScreenState newState) : EventArgs
{

/// <summary>
/// Gets the previous state that the <see cref="IMediaElement"/> instance is transitioning from.
/// </summary>
public MediaElementScreenState PreviousState { get; } = previousState;

/// <summary>
/// Gets the new state that the <see cref="IMediaElement"/> instance is transitioning to.
/// </summary>
public MediaElementScreenState NewState { get; } = newState;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,17 @@ public class MauiMediaElement : CoordinatorLayout
{
readonly RelativeLayout relativeLayout;
readonly PlayerView playerView;

readonly WeakEventManager fullScreenEventManager = new();
int defaultSystemUiVisibility;
bool isSystemBarVisible;
bool isFullScreen;

internal event EventHandler<ScreenStateChangedEventArgs> FullScreenStateChanged
{
add => fullScreenEventManager.AddEventHandler(value);
remove => fullScreenEventManager.RemoveEventHandler(value);
}

#pragma warning disable CS8618 // Non-nullable field is uninitialized. Consider declaring as nullable.
#pragma warning disable IDE0060 // Remove unused parameter
public MauiMediaElement(nint ptr, JniHandleOwnership jni) : base(Platform.AppContext)
Expand Down Expand Up @@ -129,6 +135,10 @@ void OnFullscreenButtonClick(object? sender, PlayerView.FullscreenButtonClickEve
}
// Hide/Show the SystemBars and Status bar
SetSystemBarsVisibility();

var newState = e.P0 ? MediaElementScreenState.FullScreen : MediaElementScreenState.Default;
var oldState = e.P0 ? MediaElementScreenState.Default : MediaElementScreenState.FullScreen;
fullScreenEventManager.HandleEvent(this, new ScreenStateChangedEventArgs(oldState, newState), nameof(FullScreenStateChanged));
}

void SetSystemBarsVisibility()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
using CommunityToolkit.Maui.Extensions;
using CommunityToolkit.Maui.Primitives;
using CommunityToolkit.Maui.Views;
using Microsoft.Maui.Controls;
using Microsoft.Maui.Devices;
using Microsoft.UI;
using Microsoft.UI.Windowing;
using Microsoft.UI.Xaml;
Expand Down Expand Up @@ -33,13 +31,21 @@
var hwnd = GetForegroundWindow();
return hwnd == IntPtr.Zero ? null : hwnd;
}

readonly WeakEventManager fullScreenEventManager = new();
readonly Popup popup = new();
readonly Grid fullScreenGrid = new();
readonly MediaPlayerElement mediaPlayerElement;
readonly CustomTransportControls? customTransportControls;
bool doesNavigationBarExistBeforeFullScreen;
bool isDisposed;

internal event EventHandler<ScreenStateChangedEventArgs> FullScreenStateChanged
{
add => fullScreenEventManager.AddEventHandler(value);
remove => fullScreenEventManager.RemoveEventHandler(value);
}

/// <summary>
/// Initializes a new instance of the <see cref="MauiMediaElement"/> class.
/// </summary>
Expand Down Expand Up @@ -178,7 +184,7 @@
{
var currentPage = CurrentPage;
var appWindow = GetAppWindowForCurrentWindow();

var mediaElementState = MediaElementScreenState.Default;
if (appWindow.Presenter.Kind is AppWindowPresenterKind.FullScreen)
{
appWindow.SetPresenter(AppWindowPresenterKind.Default);
Expand All @@ -195,6 +201,7 @@
var parent = mediaPlayerElement.Parent as FrameworkElement;
mediaPlayerElement.Width = parent?.Width ?? mediaPlayerElement.Width;
mediaPlayerElement.Height = parent?.Height ?? mediaPlayerElement.Height;
mediaElementState = MediaElementScreenState.Default;
}
else
{
Expand All @@ -221,6 +228,14 @@
{
popup.IsOpen = true;
}
mediaElementState = MediaElementScreenState.FullScreen;
}
if (mediaElementState is null)

Check failure on line 233 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Library (windows-latest)

Cannot convert null to 'MediaElementScreenState' because it is a non-nullable value type

Check failure on line 233 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Library (windows-latest)

Cannot convert null to 'MediaElementScreenState' because it is a non-nullable value type

Check failure on line 233 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Sample App using Latest .NET SDK (windows-latest)

Cannot convert null to 'MediaElementScreenState' because it is a non-nullable value type

Check failure on line 233 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Sample App using Latest .NET SDK (windows-latest)

Cannot convert null to 'MediaElementScreenState' because it is a non-nullable value type
{
return;
}
var newState = mediaElementState.Value;

Check failure on line 237 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Library (windows-latest)

'MediaElementScreenState' does not contain a definition for 'Value' and no accessible extension method 'Value' accepting a first argument of type 'MediaElementScreenState' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 237 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Library (windows-latest)

'MediaElementScreenState' does not contain a definition for 'Value' and no accessible extension method 'Value' accepting a first argument of type 'MediaElementScreenState' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 237 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Sample App using Latest .NET SDK (windows-latest)

'MediaElementScreenState' does not contain a definition for 'Value' and no accessible extension method 'Value' accepting a first argument of type 'MediaElementScreenState' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 237 in src/CommunityToolkit.Maui.MediaElement/Views/MauiMediaElement.windows.cs

View workflow job for this annotation

GitHub Actions / Build Sample App using Latest .NET SDK (windows-latest)

'MediaElementScreenState' does not contain a definition for 'Value' and no accessible extension method 'Value' accepting a first argument of type 'MediaElementScreenState' could be found (are you missing a using directive or an assembly reference?)
var oldState = newState == MediaElementScreenState.FullScreen ? MediaElementScreenState.Default : MediaElementScreenState.FullScreen;
fullScreenEventManager.HandleEvent(this, new ScreenStateChangedEventArgs(oldState, newState), nameof(FullScreenStateChanged));
}
}
Loading
Loading