diff --git a/Mear/Mear.Android/MainActivity.cs b/Mear/Mear.Android/MainActivity.cs index 82e5769..899ecfc 100644 --- a/Mear/Mear.Android/MainActivity.cs +++ b/Mear/Mear.Android/MainActivity.cs @@ -25,6 +25,7 @@ namespace Mear.Droid global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); + CrossMediaManager.Current.Init(); CrossMediaManager.Current.Init(this); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) diff --git a/Mear/Mear/Models/MusicControls.cs b/Mear/Mear/Models/MusicControls.cs index 8c671c1..e4725fd 100644 --- a/Mear/Mear/Models/MusicControls.cs +++ b/Mear/Mear/Models/MusicControls.cs @@ -5,6 +5,8 @@ using System.Text; using SQLite; +using Mear.Models.PlayerControls; + namespace Mear.Models { [DataContract] @@ -14,6 +16,6 @@ namespace Mear.Models [PrimaryKey, Column("Id"), AutoIncrement] public int Id { get; set; } public bool ShuffleOn { get; set; } = false; - public bool RepeatOn { get; set; } = false; + public int RepeatOn { get; set; } = (int)PlayerControls.Repeat.OFF; } } diff --git a/Mear/Mear/Models/PlayerControls/Repeat.cs b/Mear/Mear/Models/PlayerControls/Repeat.cs new file mode 100644 index 0000000..6d14c41 --- /dev/null +++ b/Mear/Mear/Models/PlayerControls/Repeat.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Mear.Models.PlayerControls +{ + public enum Repeat + { + OFF = 0, + ONE, + ALL + } +} diff --git a/Mear/Mear/Playback/MearPlayer.cs b/Mear/Mear/Playback/MearPlayer.cs index cca4897..a694b3a 100644 --- a/Mear/Mear/Playback/MearPlayer.cs +++ b/Mear/Mear/Playback/MearPlayer.cs @@ -12,7 +12,9 @@ using Mear.Constants; using Mear.Constants.API; using Mear.Models; using Mear.Models.Authentication; +using Mear.Models.PlayerControls; using Mear.Repositories.Database; +using Mear.Utilities; namespace Mear.Playback { @@ -85,11 +87,13 @@ namespace Mear.Playback } public static async Task ControlMusic(Song song, PlayControls control) { + switch (control) { case PlayControls.PLAYOFFLINE: var songPath = song.SongPath; await CrossMediaManager.Current.Play(songPath); + InitializeRepeatMode(); break; case PlayControls.PAUSE: await CrossMediaManager.Current.Pause(); @@ -98,12 +102,11 @@ namespace Mear.Playback await CrossMediaManager.Current.Play(); break; case PlayControls.STREAM: - return StreamSong(song); - break; + song = StreamSong(song); + InitializeRepeatMode(); + return song; case PlayControls.REPEAT: - // TODO: Not fully implemented - CrossMediaManager.Current.ToggleRepeat(); - var i = CrossMediaManager.Current.RepeatMode; + ToggleRepeat(); break; case PlayControls.SHUFFLE: // TODO: Implement shuffling @@ -119,6 +122,23 @@ namespace Mear.Playback return null; } + public static string RetrieveRepeatString() + { + var ctrlRepeatMode = CrossMediaManager.Current.RepeatMode; + + switch (ctrlRepeatMode) + { + case MediaManager.Playback.RepeatMode.Off: + return "RepOff"; + case MediaManager.Playback.RepeatMode.One: + return "RepOn"; + case MediaManager.Playback.RepeatMode.All: + return "RepAll"; + } + + return string.Empty; + } + private static Song StreamSong(Song song) { string tmpFile = Path.GetTempPath() + "track.mp3"; @@ -145,7 +165,8 @@ namespace Mear.Playback var response = client.DownloadData(request); - CrossMediaManager.Current.Play(tmpFile); + PlaySong(tmpFile); + song.SongPath = tmpFile; } @@ -158,6 +179,36 @@ namespace Mear.Playback return null; } + + private static void InitializeModes() + { + InitializeRepeatMode(); + } + private static void InitializeRepeatMode() + { + var ctrlRepo = new DBMusicControlsRepository(); + var repeatMode = ctrlRepo.IsRepeatOn(); + + var mode = RepeatUtility.RetrieveRepeatMode(repeatMode); + + CrossMediaManager.Current.RepeatMode = mode; + } + private static async Task PlaySong(string songPath) + { + await CrossMediaManager.Current.Play(songPath); + } + private static void ToggleRepeat() + { + var musicCtrl = new DBMusicControlsRepository(); + musicCtrl.UpdateRepeat(); + var repeatMode = (Repeat)musicCtrl.IsRepeatOn(); + + for (var rpt = RepeatUtility.RetrieveRepeatMode(repeatMode); + CrossMediaManager.Current.RepeatMode != rpt;) + { + CrossMediaManager.Current.RepeatMode = RepeatUtility.RetrieveRepeatMode(repeatMode); + } + } #endregion } } diff --git a/Mear/Mear/Repositories/Database/DBMusicControlsRepository.cs b/Mear/Mear/Repositories/Database/DBMusicControlsRepository.cs index e278381..bacfcd8 100644 --- a/Mear/Mear/Repositories/Database/DBMusicControlsRepository.cs +++ b/Mear/Mear/Repositories/Database/DBMusicControlsRepository.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Text; using Mear.Models; +using Mear.Models.PlayerControls; +using Mear.Utilities; namespace Mear.Repositories.Database { @@ -48,18 +50,15 @@ namespace Mear.Repositories.Database return false; } - public bool IsRepeatOn() + public Repeat IsRepeatOn() { try { if (DoesTableExist("MusicControls")) { - bool? repeat = _Db.Table().First().RepeatOn; + var repeat = _Db.Table().First().RepeatOn; - if (repeat != null) - { - return repeat.Value; - } + return (Repeat)repeat; } } catch (Exception ex) @@ -67,7 +66,7 @@ namespace Mear.Repositories.Database var msg = ex.Message; } - return false; + return Repeat.OFF; } public void UpdateRepeat() @@ -77,7 +76,9 @@ namespace Mear.Repositories.Database if (DoesTableExist("MusicControls")) { var control = RetrieveMusicControls(); - control.RepeatOn = !control.RepeatOn; + var repeatMode = (Repeat)control.RepeatOn; + control.RepeatOn = RepeatUtility.ToggleRepeatMode(repeatMode); + _Db.Update(control); } } diff --git a/Mear/Mear/Utilities/RepeatUtility.cs b/Mear/Mear/Utilities/RepeatUtility.cs new file mode 100644 index 0000000..9be13c4 --- /dev/null +++ b/Mear/Mear/Utilities/RepeatUtility.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Text; + +using MediaManager; + +using Mear.Models.PlayerControls; + +namespace Mear.Utilities +{ + public class RepeatUtility + { + #region Fields + #endregion + + + #region Properties + #endregion + + + #region Constructors + #endregion + + + #region Methods + public static MediaManager.Playback.RepeatMode RetrieveRepeatMode(Repeat repeatMode) + { + switch (repeatMode) + { + case Repeat.OFF: + return MediaManager.Playback.RepeatMode.Off; + case Repeat.ONE: + return MediaManager.Playback.RepeatMode.One; + case Repeat.ALL: + return MediaManager.Playback.RepeatMode.All; + } + + return MediaManager.Playback.RepeatMode.Off; + } + + public static string RepeatString(Repeat repeatMode) + { + switch (repeatMode) + { + case Repeat.OFF: + return "RepOff"; + case Repeat.ONE: + return "RepOne"; + case Repeat.ALL: + return "RepAll"; + } + + return string.Empty; + } + public static string ToggleRepeatString(Repeat repeatMode) + { + switch (repeatMode) + { + case Repeat.OFF: + return "RepOn"; + case Repeat.ONE: + return "RepAll"; + case Repeat.ALL: + return "RepOff"; + } + + return string.Empty; + } + + public static int ToggleRepeatMode(Repeat repeatMode) + { + switch (repeatMode) + { + case Repeat.OFF: + return (int)Repeat.ONE; + case Repeat.ONE: + return (int)Repeat.ALL; + case Repeat.ALL: + return (int)Repeat.OFF; + } + + return 0; + } + #endregion + } +} diff --git a/Mear/Mear/Views/MearPlayerView.xaml.cs b/Mear/Mear/Views/MearPlayerView.xaml.cs index 1060571..20d1e4c 100644 --- a/Mear/Mear/Views/MearPlayerView.xaml.cs +++ b/Mear/Mear/Views/MearPlayerView.xaml.cs @@ -12,12 +12,15 @@ using Xamarin.Forms.Xaml; using Mear.Constants; using Mear.Models; +using Mear.Models.PlayerControls; using Mear.Playback; using Mear.Repositories.Database; using Mear.Repositories.Remote; using Mear.Utilities; using Mear.ViewModels; +using RepeatMode = Mear.Models.PlayerControls.Repeat; + namespace Mear.Views { [XamlCompilation(XamlCompilationOptions.Compile)] @@ -98,10 +101,10 @@ namespace Mear.Views var controlRepo = new DBMusicControlsRepository(); var shuffleOn = controlRepo.IsShuffleOn(); - var repeatOn = controlRepo.IsRepeatOn(); + var repeatMode = (RepeatMode)controlRepo.IsRepeatOn(); Shuffle.Text = (shuffleOn) ? "ShfOn" : "ShfOff"; - Repeat.Text = (repeatOn) ? "RepOn" : "RepOff"; + Repeat.Text = MearPlayer.RetrieveRepeatString(); EndTime.Text = endTime; } @@ -185,13 +188,12 @@ namespace Mear.Views } private void Repeat_Clicked(object sender, EventArgs e) { - var musicCtrl = new DBMusicControlsRepository(); - var control = musicCtrl.IsRepeatOn(); - Repeat.Text = (!control) ? "RepOn" : "RepOff"; + Task.Run(async () => + { + await MearPlayer.ControlMusic(_song, PlayControls.REPEAT); + }).Wait(); - musicCtrl.UpdateRepeat(); - - MearPlayer.ControlMusic(_song, PlayControls.REPEAT); + Repeat.Text = MearPlayer.RetrieveRepeatString(); } private void Shuffle_Clicked(object sender, EventArgs e) {