using System.Collections.Concurrent; using Windows.Media.Control; namespace Hyperbar.Windows.MediaController; public class MediaControllerManager(IMediator mediator, IFactory factory) : IInitializer { private readonly List> cachedSessions = []; public async Task InitializeAsync() { GlobalSystemMediaTransportControlsSessionManager mediaTransportControlsSessionManager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync(); mediaTransportControlsSessionManager.SessionsChanged += OnSessionsChanged; IReadOnlyList sessions = mediaTransportControlsSessionManager.GetSessions(); foreach (GlobalSystemMediaTransportControlsSession session in sessions) { await InitializeSessionAsync(session); } } private async Task InitializeSessionAsync(GlobalSystemMediaTransportControlsSession session) { if (factory.Create(session) is MediaController mediaController) { await mediator.PublishAsync(new Created(mediaController)); cachedSessions.Add(new KeyValuePair(session, mediaController)); } } private async void OnSessionsChanged(GlobalSystemMediaTransportControlsSessionManager sender, SessionsChangedEventArgs args) { IReadOnlyList sessions = sender.GetSessions(); foreach (KeyValuePair session in cachedSessions.ToList()) { if (!sessions.Any(x => x.SourceAppUserModelId == session.Key.SourceAppUserModelId)) { cachedSessions.Remove(session); } } foreach (GlobalSystemMediaTransportControlsSession session in sessions) { if (!cachedSessions.Any(x => x.Key.SourceAppUserModelId == session.SourceAppUserModelId)) { await InitializeSessionAsync(session); } } } }