Code refactoring for cleaner view model design
This commit is contained in:
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user