Code refactoring for cleaner view model design

This commit is contained in:
watsonb8
2019-11-29 12:37:57 -05:00
parent 3398d145ac
commit 85ab39defd
15 changed files with 351 additions and 123 deletions

View File

@ -75,9 +75,9 @@ namespace Aurora.Design.Views
#endregion Player
#region Lifecycle
public virtual void OnActive() { }
public virtual Task OnActive() { return Task.FromResult<object>(null); }
public virtual void OnInactive() { }
public virtual Task OnInactive() { return Task.FromResult<object>(null); }
#endregion

View File

@ -8,6 +8,7 @@ using Aurora.Proto.General;
using Aurora.Proto.Party;
using Aurora.Proto.Events;
using Aurora.Services.ClientService;
using Aurora.Services.ClientService.Events;
using Aurora.Services.PlayerService;
using Aurora.Services.EventManager;
using Aurora.Models.Media;
@ -47,9 +48,6 @@ namespace Aurora.Design.Views.Party
PlayCommand = new Command(OnDoubleClickExecute, CanDoubleClickExecute);
_client = ClientService.Instance;
//Hook up event handler
_client.EventReceived += this.OnEventReceived;
}
~PartyViewModel()
@ -151,70 +149,100 @@ namespace Aurora.Design.Views.Party
#endregion Properties
#region Events
public override void OnActive()
/// <summary>
/// Called by framework when view becomes active
/// </summary>
/// <returns></returns>
public override async Task OnActive()
{
//TODO
//If in party subscribe to events
//If in party get events
}
public override void OnInactive()
{
//TODO
//unsubscribe
//stop getting events
if (this._state == PartyState.Hosting)
{
await SubscribeToEvents();
}
_client.OnMediaPaused += this.OnMediaPaused;
_client.OnMediaResumed += this.OnMediaResumed;
_client.OnNewMediaPlaying += this.OnNewMediaPlaying;
_client.OnPartyMemberJoined += this.OnPartyMemberJoined;
_client.OnPartyMemberLeft += this.OnPartyMemberLeft;
}
/// <summary>
/// An event handler for the client receiving update events
/// Called by framework when view becomes inactive
/// </summary>
/// <param name="sender">The object that sent the event</param>
/// <param name="eventArgs">The event arguments</param>
public void OnEventReceived(object sender, EventReceivedEventArgs eventArgs)
/// <returns></returns>
public override async Task OnInactive()
{
switch (eventArgs.BaseEvent.DerivedEventCase)
_client.StopEvents();
await UnsubscribeFromEvents();
//Stop event stream and un hook events
_client.OnMediaPaused -= this.OnMediaPaused;
_client.OnMediaResumed -= this.OnMediaResumed;
_client.OnNewMediaPlaying -= this.OnNewMediaPlaying;
_client.OnPartyMemberJoined -= this.OnPartyMemberJoined;
_client.OnPartyMemberLeft -= this.OnPartyMemberLeft;
}
/// <summary>
/// Remote media paused event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void OnMediaPaused(object sender, MediaPausedEventArgs args)
{
StopPlaying();
}
/// <summary>
/// Remote playing new media event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void OnNewMediaPlaying(object sender, NewMediaPlayingEventArgs args)
{
PlayFromBeginning(GetMediaFromQueue(args.Event.Media.Id));
}
/// <summary>
/// Remote resumed playing event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void OnMediaResumed(object sender, MediaResumedEventArgs args)
{
PlayResume();
}
/// <summary>
/// Member joined party event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void OnPartyMemberJoined(object sender, PartyMemberJoinedEventArgs args)
{
PartyMember member = new PartyMember
{
case BaseEvent.DerivedEventOneofCase.None:
{
throw new InvalidOperationException();
}
case BaseEvent.DerivedEventOneofCase.PartyMemberJoinedEvent:
{
PartyMemberJoinedEvent derivedEvent = eventArgs.BaseEvent.PartyMemberJoinedEvent;
PartyMember member = new PartyMember
{
UserName = derivedEvent.Member.UserName,
Id = derivedEvent.Member.Id,
IpAddress = derivedEvent.Member.IpAddress,
Port = derivedEvent.Member.Port
};
UserName = args.Event.Member.UserName,
Id = args.Event.Member.Id,
IpAddress = args.Event.Member.IpAddress,
Port = args.Event.Member.Port
};
Members.Add(member);
Members.Add(member);
}
break;
}
case BaseEvent.DerivedEventOneofCase.PartyMemberLeftEvent:
{
PartyMemberJoinedEvent derivedEvent = eventArgs.BaseEvent.PartyMemberJoinedEvent;
var found = Members.Where(x => x.Id == derivedEvent.Member.Id);
foreach (PartyMember member in found)
{
_members.Remove(member);
}
break;
}
case BaseEvent.DerivedEventOneofCase.MediaPlayingEvent:
{
MediaPlayingEvent derivedEvent = eventArgs.BaseEvent.MediaPlayingEvent;
Play(derivedEvent);
break;
}
case BaseEvent.DerivedEventOneofCase.MediaPausedEvent:
{
MediaPausedEvent derivedEvent = eventArgs.BaseEvent.MediaPausedEvent;
StopPlaying();
break;
}
/// <summary>
/// Member left party event
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
public void OnPartyMemberLeft(object sender, PartyMemberLeftEventArgs args)
{
var found = Members.Where(x => x.Id == args.Event.Member.Id);
foreach (PartyMember member in found)
{
_members.Remove(member);
}
}
@ -274,17 +302,32 @@ namespace Aurora.Design.Views.Party
public override void OnPlayButtonExecute()
{
_player.Play();
switch (_player.PlaybackState)
{
case PlaybackState.Buffering:
{
_player.Play();
//Fire play resume event
AudioMetadata meta = _selectedMedia.Metadata as AudioMetadata;
MediaResumedEvent mediaResumed = new MediaResumedEvent();
EventManager.Instance.FireEvent(new BaseEvent()
{
MediaResumedEvent = mediaResumed
});
break;
}
case PlaybackState.Playing:
{
_player.Pause();
//Fire play stopped event
AudioMetadata meta = _selectedMedia.Metadata as AudioMetadata;
MediaPausedEvent mediaPaused = new MediaPausedEvent();
EventManager.Instance.FireEvent(new BaseEvent()
{
MediaPausedEvent = mediaPaused
});
break;
}
}
@ -310,8 +353,9 @@ namespace Aurora.Design.Views.Party
/// </summary>
public void OnDoubleClickExecute()
{
//Fire Playing event
AudioMetadata meta = _selectedMedia.Metadata as AudioMetadata;
MediaPlayingEvent mediaPlaying = new MediaPlayingEvent()
NewMediaPlayingEvent mediaPlaying = new NewMediaPlayingEvent()
{
Media = new RemoteMediaData()
{
@ -324,7 +368,7 @@ namespace Aurora.Design.Views.Party
EventManager.Instance.FireEvent(new BaseEvent()
{
MediaPlayingEvent = mediaPlaying
NewMediaPlayingEvent = mediaPlaying
});
}
@ -355,19 +399,7 @@ namespace Aurora.Design.Views.Party
RefreshMembers();
//Subscribe to events
SubscribeRequest req = new SubscribeRequest();
req.EventTypes.Add(EventType.PartyMemberJoined);
req.EventTypes.Add(EventType.PartyMemberLeft);
req.EventTypes.Add(EventType.MediaPlaying);
req.EventTypes.Add(EventType.MediaStopped);
if (!string.IsNullOrWhiteSpace(SettingsService.Instance.ClientId))
{
req.ClientId = SettingsService.Instance.ClientId;
}
Console.WriteLine(string.Format("CLIENT {0} - SubscribeToEvents called from client with id", SettingsService.Instance.ClientId));
_client.RemoteEventClient.SubscribeToEvents(req);
await SubscribeToEvents();
QueueResponse queueResponse = _client.RemotePartyClient.GetQueue(new Empty());
@ -403,19 +435,41 @@ namespace Aurora.Design.Views.Party
_client.StopEvents();
//Unsubscribe
UnsubscribeAllRequest unsubscribeReq = new UnsubscribeAllRequest();
await _client.RemoteEventClient.UnsubscribeFromAllAsync(unsubscribeReq);
await UnsubscribeFromEvents();
//Leave party
LeavePartyRequest leaveReq = new LeavePartyRequest();
await _client.RemotePartyClient.LeavePartyAsync(leaveReq);
}
private async Task SubscribeToEvents()
{
SubscribeRequest req = new SubscribeRequest();
req.EventTypes.Add(EventType.PartyMemberJoined);
req.EventTypes.Add(EventType.PartyMemberLeft);
req.EventTypes.Add(EventType.MediaPlaying);
req.EventTypes.Add(EventType.MediaStopped);
if (!string.IsNullOrWhiteSpace(SettingsService.Instance.ClientId))
{
req.ClientId = SettingsService.Instance.ClientId;
}
Console.WriteLine(string.Format("CLIENT {0} - SubscribeToEvents called from client with id", SettingsService.Instance.ClientId));
await _client.RemoteEventClient.SubscribeToEventsAsync(req);
}
private async Task UnsubscribeFromEvents()
{
UnsubscribeAllRequest unsubscribeReq = new UnsubscribeAllRequest();
await _client.RemoteEventClient.UnsubscribeFromAllAsync(unsubscribeReq);
}
/// <summary>
/// Refresh members list.
/// </summary>
private void RefreshMembers()
{
Members.Clear();
MembersResponse response = _client.RemotePartyClient.GetPartyMembers(new Empty());
//Add members
foreach (PartyMember member in response.Members)
@ -431,17 +485,28 @@ namespace Aurora.Design.Views.Party
OnPropertyChanged("IsNotSelectingHost");
}
private async void Play(MediaPlayingEvent args)
private BaseMedia GetMediaFromQueue(string Id)
{
//TODO this design assumes all played music is in a queue
//TODO this is a slow design depending on size of queue
if (_queue.Any((BaseMedia media) => media.Id == args.Media.Id))
if (_queue.Any((BaseMedia media) => media.Id == Id))
{
BaseMedia media = _queue.First((BaseMedia med) => med.Id == args.Media.Id);
base.Media = media;
await _player.LoadMedia(base.Media).ConfigureAwait(true);
_player.Play();
BaseMedia media = _queue.First((BaseMedia med) => med.Id == Id);
return media;
}
else
{
return null;
}
}
private async void PlayFromBeginning(BaseMedia args)
{
base.Media = args;
await _player.LoadMedia(base.Media).ConfigureAwait(true);
_player.Play();
}
private void PlayResume()
{
_player.Play();
}
private void StopPlaying()

View File

@ -93,7 +93,6 @@ namespace Aurora.Design.Views.Songs
await _player.LoadMedia(base.Media).ConfigureAwait(true);
}
_player.Play();
switch (_player.PlaybackState)
{
case PlaybackState.Buffering:
@ -106,6 +105,11 @@ namespace Aurora.Design.Views.Songs
_player.Pause();
break;
}
case PlaybackState.Stopped:
{
_player.Play();
break;
}
}
}