From 11aca0668fb542d3f81ce4e348a9dafb9a2bdde8 Mon Sep 17 00:00:00 2001 From: amazing-username Date: Tue, 4 Jun 2019 17:18:51 -0700 Subject: [PATCH] Changed how songs are being played and the songs are refreshed when pulled down. --- Mear/Mear/Constants/PlayControls.cs | 18 +++++++ Mear/Mear/Playback/MearPlayer.cs | 74 ++++++++++++++++++++++++++ Mear/Mear/ViewModels/BaseViewModel.cs | 31 +++++++++-- Mear/Mear/ViewModels/SongViewModel.cs | 4 +- Mear/Mear/Views/MearPlayerView.xaml.cs | 46 +++++++++++----- Mear/Mear/Views/SongView.xaml | 1 + Mear/Mear/Views/SongView.xaml.cs | 5 +- 7 files changed, 161 insertions(+), 18 deletions(-) create mode 100644 Mear/Mear/Constants/PlayControls.cs diff --git a/Mear/Mear/Constants/PlayControls.cs b/Mear/Mear/Constants/PlayControls.cs new file mode 100644 index 0000000..dd3857f --- /dev/null +++ b/Mear/Mear/Constants/PlayControls.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mear.Constants +{ + public enum PlayControls + { + PLAYOFFLINE = 1, + PAUSE, + RESUME, + STREAM, + PREVIOUS, + NEXT, + REPEAT, + SHUFFLE + } +} diff --git a/Mear/Mear/Playback/MearPlayer.cs b/Mear/Mear/Playback/MearPlayer.cs index ea1fbc7..3514c2d 100644 --- a/Mear/Mear/Playback/MearPlayer.cs +++ b/Mear/Mear/Playback/MearPlayer.cs @@ -8,6 +8,7 @@ using MediaManager; using Newtonsoft.Json; using RestSharp; +using Mear.Constants; using Mear.Constants.API; using Mear.Models; using Mear.Models.Authentication; @@ -81,6 +82,79 @@ namespace Mear.Playback var msg = ex.Message; } } + public static async Task ControlMusic(Song song, PlayControls control) + { + switch (control) + { + case PlayControls.PLAYOFFLINE: + var songPath = song.SongPath; + await CrossMediaManager.Current.Play(songPath); + break; + case PlayControls.PAUSE: + await CrossMediaManager.Current.Pause(); + break; + case PlayControls.RESUME: + await CrossMediaManager.Current.Play(); + break; + case PlayControls.STREAM: + return StreamSong(song); + break; + case PlayControls.REPEAT: + // TODO: Implement repeat + break; + case PlayControls.SHUFFLE: + // TODO: Implement shuffling + break; + case PlayControls.NEXT: + // TODO: Implement Next + break; + case PlayControls.PREVIOUS: + break; + // TODO: Implement Next + } + + return null; + } + + private static Song StreamSong(Song song) + { + string tmpFile = Path.GetTempPath() + "track.mp3"; + + if (File.Exists(tmpFile)) + { + File.Delete(tmpFile); + } + + try + { + using (var writer = File.OpenWrite(tmpFile)) + { + var client = new RestClient(API.ApiUrl); + var apiEndpoint = $@"api/{API.APIVersion}/song/stream/{song.Id}"; ; + + var request = new RestRequest(apiEndpoint, Method.GET); + var tokRepo = new DBTokenRepository(); + var token = tokRepo.RetrieveToken(); + + request.AddHeader("Authorization", $"Bearer {token.AccessToken}"); + request.ResponseWriter = (responseStream) => + responseStream.CopyTo(writer); + + var response = client.DownloadData(request); + + CrossMediaManager.Current.Play(tmpFile); + song.SongPath = tmpFile; + } + + return song; + } + catch (Exception ex) + { + var msg = ex.Message; + } + + return null; + } #endregion } } diff --git a/Mear/Mear/ViewModels/BaseViewModel.cs b/Mear/Mear/ViewModels/BaseViewModel.cs index 6bc9650..80d7913 100644 --- a/Mear/Mear/ViewModels/BaseViewModel.cs +++ b/Mear/Mear/ViewModels/BaseViewModel.cs @@ -12,7 +12,32 @@ namespace Mear.ViewModels #region Fields #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; - #endregion - #endregion - } + #endregion + private bool _isRefreshing; + #endregion + + + #region Properties + public bool IsRefreshing + { + get => _isRefreshing; + set + { + _isRefreshing = value; + NotifyPropertyChanged("IsRefreshing"); + } + } + #endregion + + + #region Methods + private void NotifyPropertyChanged(string propertyName) + { + if (PropertyChanged != null) + { + PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); + } + } + #endregion + } } diff --git a/Mear/Mear/ViewModels/SongViewModel.cs b/Mear/Mear/ViewModels/SongViewModel.cs index bd29fb8..e7a4872 100644 --- a/Mear/Mear/ViewModels/SongViewModel.cs +++ b/Mear/Mear/ViewModels/SongViewModel.cs @@ -110,7 +110,7 @@ namespace Mear.ViewModels songs = rmtSongs; } - _songItems.Clear(); + _songItems.Clear(); foreach (var song in songs) { @@ -121,6 +121,8 @@ namespace Mear.ViewModels { var msg = ex.Message; } + + IsRefreshing = false; } #endregion } diff --git a/Mear/Mear/Views/MearPlayerView.xaml.cs b/Mear/Mear/Views/MearPlayerView.xaml.cs index cb9dfb4..c5c0e85 100644 --- a/Mear/Mear/Views/MearPlayerView.xaml.cs +++ b/Mear/Mear/Views/MearPlayerView.xaml.cs @@ -10,7 +10,9 @@ using MediaManager; using Xamarin.Forms; using Xamarin.Forms.Xaml; +using Mear.Constants; using Mear.Models; +using Mear.Playback; using Mear.Repositories.Database; using Mear.Repositories.Remote; using Mear.Utilities; @@ -55,24 +57,36 @@ namespace Mear.Views #region Methods + private ToolbarItem DownloadOption() + { + var dnloadOpt = new ToolbarItem(); + dnloadOpt.Text = "Download"; + dnloadOpt.Order = ToolbarItemOrder.Secondary; + dnloadOpt.Priority = 1; + dnloadOpt.Clicked += Download_Clicked; + + return dnloadOpt; + } + private ToolbarItem RemoveOption() + { + var rmvOpt = new ToolbarItem(); + rmvOpt.Text = "Remove"; + rmvOpt.Order = ToolbarItemOrder.Secondary; + rmvOpt.Priority = 1; + rmvOpt.Clicked += Remove_Clicked; + + return rmvOpt; + } private void InitializeOptions() { if (!_song.Downloaded) { - var dnloadOpt = new ToolbarItem(); - dnloadOpt.Text = "Download"; - dnloadOpt.Order = ToolbarItemOrder.Secondary; - dnloadOpt.Priority = 1; - dnloadOpt.Clicked += Download_Clicked; + var dnloadOpt = DownloadOption(); ToolbarItems.Add(dnloadOpt); } else { - var rmvOpt = new ToolbarItem(); - rmvOpt.Text = "Remove"; - rmvOpt.Order = ToolbarItemOrder.Secondary; - rmvOpt.Priority = 1; - rmvOpt.Clicked += Remove_Clicked; + var rmvOpt = RemoveOption(); ToolbarItems.Add(rmvOpt); } } @@ -151,11 +165,11 @@ namespace Mear.Views { if (CrossMediaManager.Current.IsPlaying()) { - await CrossMediaManager.Current.Pause(); + await MearPlayer.ControlMusic(_song, PlayControls.PAUSE); } else { - await CrossMediaManager.Current.Play(); + await MearPlayer.ControlMusic(_song, PlayControls.RESUME); } } private void Next_Clicked(object sender, EventArgs e) @@ -181,11 +195,17 @@ namespace Mear.Views private void Download_Clicked(object sender, EventArgs e) { + var act = ToolbarItems.Where(tl => tl.Priority == 1).First(); + ToolbarItems.Remove(act); var songRepo = new RemoteSongRepository(); songRepo.DownloadSong(_song); + ToolbarItems.Add(RemoveOption()); } private async void Remove_Clicked(object sender, EventArgs e) { + var act = ToolbarItems.Where(tl => tl.Priority == 1).First(); + + ToolbarItems.Remove(act); var dbSongRepo = new DBSongRepository(); var plyCount = new DBPlayCountRepository(); dbSongRepo.DeleteSong(_song); @@ -193,6 +213,8 @@ namespace Mear.Views _song.Downloaded = false; File.Delete(_song.SongPath); + + ToolbarItems.Add(DownloadOption()); } private async void PlayCount_Clicked(object sender, EventArgs e) { diff --git a/Mear/Mear/Views/SongView.xaml b/Mear/Mear/Views/SongView.xaml index ba6c38e..46f398d 100644 --- a/Mear/Mear/Views/SongView.xaml +++ b/Mear/Mear/Views/SongView.xaml @@ -20,6 +20,7 @@ IsPullToRefreshEnabled="True" RowHeight="75" RefreshCommand="{Binding RefreshSongs}" + IsRefreshing="{Binding IsRefreshing}" ItemSelected="SongListView_ItemSelected" > diff --git a/Mear/Mear/Views/SongView.xaml.cs b/Mear/Mear/Views/SongView.xaml.cs index 6fc0223..c3df4f4 100644 --- a/Mear/Mear/Views/SongView.xaml.cs +++ b/Mear/Mear/Views/SongView.xaml.cs @@ -8,6 +8,7 @@ using MediaManager; using Xamarin.Forms; using Xamarin.Forms.Xaml; +using Mear.Constants; using Mear.Models; using Mear.Playback; using Mear.Repositories.Database; @@ -54,11 +55,11 @@ namespace Mear.Views var song = (Song)SongListView.SelectedItem; if (song.Downloaded) { - await MearPlayer.PlaySong(song); + await MearPlayer.ControlMusic(song, PlayControls.PLAYOFFLINE); } else { - song = await MearPlayer.StreamSongDemoAsync(song); + song = await MearPlayer.ControlMusic(song, PlayControls.STREAM); var plyCountRepo = new DBPlayCountRepository(); plyCountRepo.AffectPlayCount(song); }