diff --git a/MusicApp/MainActivity.cs b/MusicApp/MainActivity.cs index c2cdb99..533f283 100644 --- a/MusicApp/MainActivity.cs +++ b/MusicApp/MainActivity.cs @@ -1546,7 +1546,7 @@ namespace MusicApp public void OnSessionResumed(Java.Lang.Object session, bool wasSuspended) { Console.WriteLine("&Session Resumed"); - SwitchRemote(((CastSession)session).RemoteMediaClient); + SwitchRemote(((CastSession)session).RemoteMediaClient, false); } public void OnSessionResuming(Java.Lang.Object session, string sessionId) { } @@ -1556,7 +1556,7 @@ namespace MusicApp public void OnSessionStarted(Java.Lang.Object session, string sessionId) { Console.WriteLine("&Session Started"); - SwitchRemote(((CastSession)session).RemoteMediaClient); + SwitchRemote(((CastSession)session).RemoteMediaClient, true); } public void OnSessionStarting(Java.Lang.Object session) { } @@ -1567,7 +1567,7 @@ namespace MusicApp SwitchRemote(null); } - private async void SwitchRemote(RemoteMediaClient remoteClient) + private async void SwitchRemote(RemoteMediaClient remoteClient, bool justStarted = true) { Console.WriteLine("&Switching to another remote player: (null check)" + (remoteClient == null)); @@ -1606,7 +1606,19 @@ namespace MusicApp await Task.Delay(1000); if (MusicPlayer.UseCastPlayer) - MusicPlayer.GetQueueFromCast(); + { + if (justStarted) + { + Intent intent = new Intent(this, typeof(MusicPlayer)); + intent.SetAction("StartCasting"); + StartService(intent); + } + else + { + MusicPlayer.Initialized = true; + MusicPlayer.GetQueueFromCast(); + } + } } } } \ No newline at end of file diff --git a/MusicApp/MusicApp.csproj b/MusicApp/MusicApp.csproj index 440751d..3c06b8b 100644 --- a/MusicApp/MusicApp.csproj +++ b/MusicApp/MusicApp.csproj @@ -160,7 +160,6 @@ - ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll @@ -286,7 +285,6 @@ - @@ -314,7 +312,7 @@ - + diff --git a/MusicApp/Resources/Portable Class/CastQueueManager.cs b/MusicApp/Resources/Portable Class/CastQueueManager.cs index ba044f6..d5412d3 100644 --- a/MusicApp/Resources/Portable Class/CastQueueManager.cs +++ b/MusicApp/Resources/Portable Class/CastQueueManager.cs @@ -8,17 +8,24 @@ namespace MusicApp.Resources.Portable_Class public override void ItemsUpdatedAtIndexes(int[] indexes) { base.ItemsUpdatedAtIndexes(indexes); - System.Console.WriteLine("&Index has come"); foreach (int index in indexes) { + Song song = (Song)MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(index); + if (MusicPlayer.queue.Count > index) - MusicPlayer.queue[index] = (Song)MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(index); + MusicPlayer.queue[index] = song; else { while (MusicPlayer.queue.Count < index) MusicPlayer.queue.Add(null); - MusicPlayer.queue.Add((Song)MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(index)); + MusicPlayer.queue.Add(song); + } + + if(song != null) + { + Queue.instance?.adapter.NotifyItemChanged(index, song.Title); + Home.instance?.QueueAdapter?.NotifyItemChanged(index, song.Title); } MusicPlayer.WaitForIndex.Remove(index); diff --git a/MusicApp/Resources/Portable Class/Home.cs b/MusicApp/Resources/Portable Class/Home.cs index cb8a7c9..b49a5f3 100644 --- a/MusicApp/Resources/Portable Class/Home.cs +++ b/MusicApp/Resources/Portable Class/Home.cs @@ -23,6 +23,7 @@ namespace MusicApp.Resources.Portable_Class public static Home instance; public RecyclerView ListView; public HomeAdapter adapter; + public LineAdapter QueueAdapter; public ItemTouchHelper itemTouchHelper; public static List adapterItems = new List(); public List selectedTopics = new List(); @@ -446,13 +447,9 @@ namespace MusicApp.Resources.Portable_Class public void RefreshQueue() { - if (MusicPlayer.UseCastPlayer && adapterItems.Count > 0) + if (adapterItems.Count > 0) { - adapterItems[0].recycler?.SetAdapter(new LineAdapter(adapterItems[0].recycler)); - } - else if (adapterItems.Count > 0) - { - adapterItems[0].recycler?.GetAdapter()?.NotifyDataSetChanged(); + QueueAdapter?.NotifyDataSetChanged(); if (MusicPlayer.CurrentID() != -1 && MusicPlayer.CurrentID() <= MusicPlayer.queue.Count) adapterItems[0].recycler?.ScrollToPosition(MusicPlayer.CurrentID()); } diff --git a/MusicApp/Resources/Portable Class/HomeAdapter.cs b/MusicApp/Resources/Portable Class/HomeAdapter.cs index 5154023..3d13d13 100644 --- a/MusicApp/Resources/Portable Class/HomeAdapter.cs +++ b/MusicApp/Resources/Portable Class/HomeAdapter.cs @@ -84,7 +84,9 @@ namespace MusicApp.Resources.Portable_Class holder.recycler.SetLayoutManager(new LinearLayoutManager(MainActivity.instance, LinearLayoutManager.Horizontal, false)); if (items[position].SectionTitle == "Queue") { - holder.recycler.SetAdapter(new LineAdapter(holder.recycler)); + LineAdapter adapter = new LineAdapter(holder.recycler); + Home.instance.QueueAdapter = adapter; + holder.recycler.SetAdapter(adapter); holder.more.Click += (sender, e) => { Intent intent = new Intent(MainActivity.instance, typeof(Queue)); diff --git a/MusicApp/Resources/Portable Class/LineAdapter.cs b/MusicApp/Resources/Portable Class/LineAdapter.cs index 79539a5..06553fc 100644 --- a/MusicApp/Resources/Portable Class/LineAdapter.cs +++ b/MusicApp/Resources/Portable Class/LineAdapter.cs @@ -1,6 +1,7 @@ using Android.App; using Android.Content; using Android.Gms.Cast.Framework.Media; +using Android.Graphics; using Android.Support.V7.Widget; using Android.Views; using Android.Widget; @@ -50,12 +51,7 @@ namespace MusicApp.Resources.Portable_Class { this.recycler = recycler; UseQueue = true; - - if (MusicPlayer.UseCastPlayer) - MusicPlayer.RemotePlayer.MediaQueue.RegisterCallback(new QueueCallback(this)); - songList = MusicPlayer.queue; - } public override void OnBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) @@ -71,10 +67,17 @@ namespace MusicApp.Resources.Portable_Class { RecyclerHolder holder = (RecyclerHolder)viewHolder; - Song song = UseQueue && MusicPlayer.UseCastPlayer ? (Song)MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(position) : songList[position]; + Song song = songList.Count <= position ? null : songList[position]; - if (song == null) + + if (song == null && UseQueue) + { + holder.Title.Text = ""; + holder.AlbumArt.SetImageResource(Resource.Color.background_material_dark); + + MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(position); return; + } holder.Title.Text = song.Title; @@ -93,6 +96,14 @@ namespace MusicApp.Resources.Portable_Class } } + public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position, IList payloads) + { + if (payloads.Count > 0 && payloads[0].ToString() == ((RecyclerHolder)holder).Title.Text) + return; + + base.OnBindViewHolder(holder, position, payloads); + } + public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0) diff --git a/MusicApp/Resources/Portable Class/MusicPlayer.cs b/MusicApp/Resources/Portable Class/MusicPlayer.cs index 3cdb42d..a948bd4 100644 --- a/MusicApp/Resources/Portable Class/MusicPlayer.cs +++ b/MusicApp/Resources/Portable Class/MusicPlayer.cs @@ -68,6 +68,7 @@ namespace MusicApp.Resources.Portable_Class public static bool userStopped = true; public static bool isLiveStream = false; public static bool ShouldResumePlayback; + public static bool Initialized = false; private static long LastTimer = -1; private Notification notification; @@ -166,6 +167,10 @@ namespace MusicApp.Resources.Portable_Class InitializeService(); CastCallback.OnStatusUpdated(); return StartCommandResult.Sticky; + + case "StartCasting": + StartCasting(); + break; } if (intent.Action != null) @@ -340,11 +345,11 @@ namespace MusicApp.Resources.Portable_Class ParseNextSong(); } - public void Play(Song song, long progress = -1) + public async void Play(Song song, long progress = -1) { if (!song.IsParsed) { - ParseAndPlay("Play", song.YoutubeID, song.Title, song.Artist, song.Album); + song = await ParseSong(song); return; } @@ -449,124 +454,87 @@ namespace MusicApp.Resources.Portable_Class UpdateQueueDataBase(); } + private async Task ParseSong(Song song) + { + try + { + YoutubeClient client = new YoutubeClient(); + var mediaStreamInfo = await client.GetVideoMediaStreamInfosAsync(song.YoutubeID); + AudioStreamInfo streamInfo = mediaStreamInfo.Audio.OrderBy(s => s.Bitrate).Last(); + if (mediaStreamInfo.HlsLiveStreamUrl != null) + { + song.Path = mediaStreamInfo.HlsLiveStreamUrl; + song.IsLiveStream = true; + + } + else + { + song.Path = streamInfo.Url; + song.IsLiveStream = false; + } + + Video video = await client.GetVideoAsync(song.YoutubeID); + + if (song.Title == null) + { + song.Title = video.Title; + song.Artist = video.Author; + song.Album = video.Thumbnails.HighResUrl; + } + + if (!song.IsLiveStream) + song.ExpireDate = mediaStreamInfo.ValidUntil; + + song.IsParsed = true; + } + catch (System.Net.Http.HttpRequestException) + { + Console.WriteLine("&Parse time out"); + MainActivity.instance.Timout(); + parsing = false; + if (MainActivity.instance != null) + MainActivity.instance.FindViewById(Resource.Id.ytProgress).Visibility = ViewStates.Gone; + return null; + } + + return song; + } + private async void ParseAndPlay(string action, string videoID, string title, string artist, string thumbnailURL, bool showPlayer = true) { - if (!parsing) + if (MainActivity.instance != null && action == "Play") { - parsing = true; - - if (MainActivity.instance != null && action == "Play") - { - ProgressBar parseProgress = MainActivity.instance.FindViewById(Resource.Id.ytProgress); - parseProgress.Visibility = ViewStates.Visible; - parseProgress.ScaleY = 6; - Player.instance.Buffering(); - } - - try - { - YoutubeClient client = new YoutubeClient(); - var mediaStreamInfo = await client.GetVideoMediaStreamInfosAsync(videoID); - AudioStreamInfo streamInfo = mediaStreamInfo.Audio.OrderBy(s => s.Bitrate).Last(); - bool isLive = false; - string streamURL = streamInfo.Url; - if (mediaStreamInfo.HlsLiveStreamUrl != null) - { - streamURL = mediaStreamInfo.HlsLiveStreamUrl; - isLive = true; - } - - - if (title == null) - { - Video video = await client.GetVideoAsync(videoID); - title = video.Title; - artist = video.Author; - thumbnailURL = video.Thumbnails.HighResUrl; - } - - Console.WriteLine("&Use Cast Player: " + UseCastPlayer); - DateTimeOffset? expireDate = null; - - if (UseCastPlayer) - { - Video info = await client.GetVideoAsync(videoID); - thumbnailURL = info.Thumbnails.HighResUrl; - if (artist == null || artist == "") - artist = info.Author; - - if (!isLive) - { - expireDate = mediaStreamInfo.ValidUntil; - } - } - - Console.WriteLine("&Starting playback"); - - switch (action) - { - case "Play": - Play(streamURL, title, artist, videoID, thumbnailURL, isLive, expireDate); - break; - - case "PlayNext": - AddToQueue(streamURL, title, artist, videoID, thumbnailURL, isLive); - parsing = false; - return; - - case "PlayLast": - PlayLastInQueue(streamURL, title, artist, videoID, thumbnailURL, isLive); - parsing = false; - return; - } - - Console.WriteLine("&Action skipped"); - if (!UseCastPlayer) - { - Video info = await client.GetVideoAsync(videoID); - thumbnailURL = info.Thumbnails.HighResUrl; - if (artist == null || artist == "") - artist = info.Author; - - queue[CurrentID()].Album = thumbnailURL; - queue[CurrentID()].Artist = artist; - - if (!isLive) - { - expireDate = mediaStreamInfo.ValidUntil; - queue[CurrentID()].ExpireDate = expireDate; - } - } - } - catch (System.Net.Http.HttpRequestException) - { - MainActivity.instance.Timout(); - parsing = false; - if (MainActivity.instance != null) - MainActivity.instance.FindViewById(Resource.Id.ytProgress).Visibility = ViewStates.Gone; - return; - } - //catch - //{ - // MainActivity.instance.Unknow(); - // parsing = false; - // if (MainActivity.instance != null) - // MainActivity.instance.FindViewById(Resource.Id.ytProgress).Visibility = ViewStates.Gone; - // return; - //} - - Console.WriteLine("&Catch block exited"); - - Player.instance?.RefreshPlayer(); - if (MainActivity.instance != null) - { - MainActivity.instance.FindViewById(Resource.Id.ytProgress).Visibility = ViewStates.Gone; - MainActivity.instance.ShowSmallPlayer(); - MainActivity.instance.ShowPlayer(); - } - UpdateQueueItemDB(await GetItem()); - parsing = false; + ProgressBar parseProgress = MainActivity.instance.FindViewById(Resource.Id.ytProgress); + parseProgress.Visibility = ViewStates.Visible; + parseProgress.ScaleY = 6; + Player.instance.Buffering(); } + + Song song = await ParseSong(new Song(title, artist, thumbnailURL, videoID, -1, -1, null, true, false)); + + switch (action) + { + case "Play": + Play(song); + break; + + case "PlayNext": + AddToQueue(song); + return; + + case "PlayLast": + PlayLastInQueue(song); + return; + } + + Player.instance?.RefreshPlayer(); + if (MainActivity.instance != null) + { + MainActivity.instance.FindViewById(Resource.Id.ytProgress).Visibility = ViewStates.Gone; + MainActivity.instance.ShowSmallPlayer(); + MainActivity.instance.ShowPlayer(); + } + UpdateQueueItemDB(await GetItem()); } /*async*/ void GenerateNext(int number) @@ -1555,16 +1523,39 @@ namespace MusicApp.Resources.Portable_Class return new MediaQueueItem.Builder(GetMediaInfo(song)).Build(); } - public async static void GetQueueFromCast() + private async void StartCasting() { - if (UseCastPlayer) + if (UseCastPlayer && (RemotePlayer.MediaQueue == null || RemotePlayer.MediaQueue.ItemCount == 0)) { - if (RemotePlayer?.MediaStatus?.QueueItems.Count == 0) + for (int i = 0; i < queue.Count; i++) { - Toast.MakeText(MainActivity.instance, "QueueItems count == 0", ToastLength.Long).Show(); - return; + if (queue[i].IsYt && !queue[i].IsParsed) + queue[i] = await ParseSong(queue[i]); } + RemotePlayer.QueueLoad(queue.ConvertAll(GetQueueItem).ToArray(), currentID, 0, CurrentPosition, null); + + if (noisyRegistered) + UnregisterReceiver(noisyReceiver); + + if (player != null) + { + player.Stop(); + player.Release(); + player = null; + } + + if (isRunning) + RemotePlayer.Play(); + + Initialized = true; + } + } + + public async static void GetQueueFromCast() + { + if (UseCastPlayer && Initialized) + { if(RemotePlayer.CurrentItem != null) currentID = RemotePlayer.MediaQueue.IndexOfItemWithId(RemotePlayer.CurrentItem.ItemId); diff --git a/MusicApp/Resources/Portable Class/Queue.cs b/MusicApp/Resources/Portable Class/Queue.cs index 0f334d6..007e3d1 100644 --- a/MusicApp/Resources/Portable Class/Queue.cs +++ b/MusicApp/Resources/Portable Class/Queue.cs @@ -1,10 +1,8 @@ using Android.App; using Android.Content; using Android.Content.PM; -using Android.Gms.Cast.Framework.Media; using Android.Graphics; using Android.OS; -using Android.Support.Design.Widget; using Android.Support.V7.App; using Android.Support.V7.Widget; using Android.Support.V7.Widget.Helper; @@ -20,7 +18,7 @@ namespace MusicApp.Resources.Portable_Class { public static Queue instance; public RecyclerView ListView; - public RecyclerAdapter adapter; + public QueueAdapter adapter; public ItemTouchHelper itemTouchHelper; public IMenu menu; @@ -44,12 +42,7 @@ namespace MusicApp.Resources.Portable_Class ListView = FindViewById(Resource.Id.recycler); ListView.SetLayoutManager(new LinearLayoutManager(Application.Context)); - - if (MusicPlayer.queue != null) - adapter = new RecyclerAdapter(MusicPlayer.queue); - else - adapter = new RecyclerAdapter(new List()); - + adapter = new QueueAdapter(MusicPlayer.queue); ListView.SetAdapter(adapter); adapter.ItemClick += ListView_ItemClick; adapter.ItemLongCLick += ListView_ItemLongCLick; @@ -65,8 +58,7 @@ namespace MusicApp.Resources.Portable_Class private void Scroll(object sender, View.ScrollChangeEventArgs e) { - if (((LinearLayoutManager)ListView.GetLayoutManager()).FindLastCompletelyVisibleItemPosition() == adapter.songList.Count) - LoadMore(); + } protected override void OnStop() @@ -81,14 +73,7 @@ namespace MusicApp.Resources.Portable_Class public void Refresh() { - - if (!MusicPlayer.UseCastPlayer) - adapter.UpdateList(MusicPlayer.queue); - else - { - adapter.NotifyDataSetChanged(); - MusicPlayer.RemotePlayer.MediaQueue.RegisterCallback(new QueueCallback(adapter)); - } + adapter.UpdateList(MusicPlayer.queue); } public void RefreshCurrent() @@ -158,11 +143,6 @@ namespace MusicApp.Resources.Portable_Class item.Icon.ClearColorFilter(); } - public void LoadMore() - { - List songList = MusicPlayer.queue.Except(adapter.songList).ToList(); - } - private void ListView_ItemClick(object sender, int Position) { Song item = MusicPlayer.queue[Position]; diff --git a/MusicApp/Resources/Portable Class/RecyclerAdapter.cs b/MusicApp/Resources/Portable Class/QueueAdapter.cs similarity index 74% rename from MusicApp/Resources/Portable Class/RecyclerAdapter.cs rename to MusicApp/Resources/Portable Class/QueueAdapter.cs index 9319e07..149557f 100644 --- a/MusicApp/Resources/Portable Class/RecyclerAdapter.cs +++ b/MusicApp/Resources/Portable Class/QueueAdapter.cs @@ -1,10 +1,10 @@ using Android.App; using Android.Content; -using Android.Gms.Cast.Framework.Media; using Android.Graphics; using Android.Support.Design.Widget; using Android.Support.V7.Widget; using Android.Views; +using Java.Lang; using MusicApp.Resources.values; using Square.Picasso; using System; @@ -12,19 +12,16 @@ using System.Collections.Generic; namespace MusicApp.Resources.Portable_Class { - public class RecyclerAdapter : RecyclerView.Adapter, IItemTouchAdapter + public class QueueAdapter : RecyclerView.Adapter, IItemTouchAdapter { public List songList; public event EventHandler ItemClick; public event EventHandler ItemLongCLick; public int listPadding; - public RecyclerAdapter(List songList) + public QueueAdapter(List songList) { this.songList = songList; - - if(MusicPlayer.UseCastPlayer) - MusicPlayer.RemotePlayer.MediaQueue.RegisterCallback(new QueueCallback(this)); } public void UpdateList(List songList) @@ -65,10 +62,52 @@ namespace MusicApp.Resources.Portable_Class { RecyclerHolder holder = (RecyclerHolder)viewHolder; - Song song = MusicPlayer.UseCastPlayer ? (Song)MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(position) : songList[position]; + if (MainActivity.Theme == 1) + { + holder.more.SetColorFilter(Color.White); + holder.reorder.SetColorFilter(Color.White); + holder.Title.SetTextColor(Color.White); + holder.Artist.SetTextColor(Color.White); + holder.Artist.Alpha = 0.7f; + holder.youtubeIcon.SetColorFilter(Color.White); + holder.ItemView.SetBackgroundColor(Color.ParseColor("#424242")); + } + else + holder.ItemView.SetBackgroundColor(Color.White); + holder.reorder.Visibility = ViewStates.Visible; + if (position == MusicPlayer.CurrentID()) + { + holder.status.Visibility = ViewStates.Visible; + holder.status.Text = MusicPlayer.isRunning ? "Playing" : "Paused"; + holder.status.SetTextColor(MusicPlayer.isRunning ? Color.Argb(255, 244, 81, 30) : Color.Argb(255, 66, 165, 245)); + } + else + holder.status.Visibility = ViewStates.Gone; + + + Song song = songList.Count <= position ? null : songList[position]; if (song == null) + { + if (holder.Title.Text.Length == 0) + holder.Title.Text = "aizquruhgqognbq"; + if (holder.Artist.Text.Length == 0) + holder.Artist.Text = "ZJKGNZgzn"; + + holder.Title.SetTextColor(Color.Transparent); + holder.Title.SetBackgroundResource(Resource.Color.background_material_dark); + holder.Artist.SetTextColor(Color.Transparent); + holder.Artist.SetBackgroundResource(Resource.Color.background_material_dark); + holder.AlbumArt.SetImageResource(Resource.Color.background_material_dark); + + MusicPlayer.RemotePlayer.MediaQueue.GetItemAtIndex(position); return; + } + else + { + holder.Title.SetBackgroundResource(0); + holder.Artist.SetBackgroundResource(0); + } holder.Title.Text = song.Title; holder.Artist.Text = song.Artist; @@ -115,61 +154,31 @@ namespace MusicApp.Resources.Portable_Class else holder.Title.SetTextSize(Android.Util.ComplexUnitType.Dip, 14); - float scale = MainActivity.instance.Resources.DisplayMetrics.Density; - if (Queue.instance != null) + if (!song.IsParsed && song.IsYt) { - holder.reorder.Visibility = ViewStates.Visible; - if (!song.IsParsed && song.IsYt) - { - holder.youtubeIcon.SetImageResource(Resource.Drawable.needProcessing); - holder.youtubeIcon.Visibility = ViewStates.Visible; - - if (MainActivity.Theme == 1) - holder.youtubeIcon.SetColorFilter(Color.White); - } - else if (song.IsYt) - { - holder.youtubeIcon.SetImageResource(Resource.Drawable.PublicIcon); - holder.youtubeIcon.Visibility = ViewStates.Visible; - - if (MainActivity.Theme == 1) - holder.youtubeIcon.SetColorFilter(Color.White); - } - else - { - holder.youtubeIcon.Visibility = ViewStates.Gone; - } - - if (position == MusicPlayer.CurrentID()) - { - holder.status.Visibility = ViewStates.Visible; - holder.status.Text = MusicPlayer.isRunning ? "Playing" : "Paused"; - holder.status.SetTextColor(MusicPlayer.isRunning ? Color.Argb(255, 244, 81, 30) : Color.Argb(255, 66, 165, 245)); - } - else - holder.status.Visibility = ViewStates.Gone; + holder.youtubeIcon.SetImageResource(Resource.Drawable.needProcessing); + holder.youtubeIcon.Visibility = ViewStates.Visible; + } + else if (song.IsYt) + { + holder.youtubeIcon.SetImageResource(Resource.Drawable.PublicIcon); + holder.youtubeIcon.Visibility = ViewStates.Visible; } else { - holder.reorder.Visibility = ViewStates.Gone; + holder.youtubeIcon.Visibility = ViewStates.Gone; } - - if (MainActivity.Theme == 1) - { - holder.more.SetColorFilter(Color.White); - holder.reorder.SetColorFilter(Color.White); - holder.Title.SetTextColor(Color.White); - holder.Artist.SetTextColor(Color.White); - holder.Artist.Alpha = 0.7f; - } - - if (MainActivity.Theme == 0) - holder.ItemView.SetBackgroundColor(Color.White); - else - holder.ItemView.SetBackgroundColor(Color.ParseColor("#424242")); } } + public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position, IList payloads) + { + if (payloads.Count > 0 && payloads[0].ToString() == ((RecyclerHolder)holder).Title.Text) + return; + + base.OnBindViewHolder(holder, position, payloads); + } + public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0) diff --git a/MusicApp/Resources/Portable Class/QueueCallback.cs b/MusicApp/Resources/Portable Class/QueueCallback.cs deleted file mode 100644 index ddc86ba..0000000 --- a/MusicApp/Resources/Portable Class/QueueCallback.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Android.Gms.Cast.Framework.Media; -using Android.Support.V7.Widget; - -namespace MusicApp.Resources.Portable_Class -{ - public class QueueCallback : MediaQueue.Callback - { - public RecyclerView.Adapter adapter; - - public QueueCallback(RecyclerView.Adapter adapter) - { - this.adapter = adapter; - } - - - public override void ItemsInsertedInRange(int insertIndex, int insertCount) - { - base.ItemsInsertedInRange(insertIndex, insertCount); - adapter.NotifyItemRangeInserted(insertIndex, insertCount); - } - - public override void ItemsReloaded() - { - base.ItemsReloaded(); - adapter.NotifyDataSetChanged(); - } - - public override void ItemsRemovedAtIndexes(int[] indexes) - { - base.ItemsRemovedAtIndexes(indexes); - foreach(int index in indexes) - adapter.NotifyItemRemoved(index); - } - - public override void ItemsUpdatedAtIndexes(int[] indexes) - { - base.ItemsUpdatedAtIndexes(indexes); - foreach (int index in indexes) - adapter.NotifyItemChanged(index); - } - - public override void MediaQueueChanged() - { - base.MediaQueueChanged(); - adapter.NotifyDataSetChanged(); - } - - public override void MediaQueueWillChange() - { - base.MediaQueueWillChange(); - } - } -} \ No newline at end of file diff --git a/MusicApp/Resources/values/Song.cs b/MusicApp/Resources/values/Song.cs index a9f20aa..ce11d5c 100644 --- a/MusicApp/Resources/values/Song.cs +++ b/MusicApp/Resources/values/Song.cs @@ -1,5 +1,6 @@ using System; using Android.Gms.Cast; +using Java.Lang; using Newtonsoft.Json; using SQLite;