Changed how songs are being played and the songs are refreshed when pulled down.

This commit is contained in:
amazing-username
2019-06-04 17:18:51 -07:00
parent ca4ec72e2c
commit 11aca0668f
7 changed files with 161 additions and 18 deletions
+18
View File
@@ -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
}
}
+74
View File
@@ -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<Song> 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
}
}
+25
View File
@@ -13,6 +13,31 @@ namespace Mear.ViewModels
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
#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
}
}
+2
View File
@@ -121,6 +121,8 @@ namespace Mear.ViewModels
{
var msg = ex.Message;
}
IsRefreshing = false;
}
#endregion
}
+29 -7
View File
@@ -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 void InitializeOptions()
{
if (!_song.Downloaded)
private ToolbarItem DownloadOption()
{
var dnloadOpt = new ToolbarItem();
dnloadOpt.Text = "Download";
dnloadOpt.Order = ToolbarItemOrder.Secondary;
dnloadOpt.Priority = 1;
dnloadOpt.Clicked += Download_Clicked;
ToolbarItems.Add(dnloadOpt);
return dnloadOpt;
}
else
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 = DownloadOption();
ToolbarItems.Add(dnloadOpt);
}
else
{
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)
{
+1
View File
@@ -20,6 +20,7 @@
IsPullToRefreshEnabled="True"
RowHeight="75"
RefreshCommand="{Binding RefreshSongs}"
IsRefreshing="{Binding IsRefreshing}"
ItemSelected="SongListView_ItemSelected" >
<ListView.ItemTemplate>
<DataTemplate>
+3 -2
View File
@@ -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);
}