Skip to content

Commit

Permalink
Android crashes fixes (#541)
Browse files Browse the repository at this point in the history
  • Loading branch information
akrol95 authored Feb 29, 2024
1 parent 0b2b7c4 commit 0cc5153
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 34 deletions.
93 changes: 62 additions & 31 deletions BMM.Core/NewMediaPlayer/MediaQueue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ namespace BMM.Core.NewMediaPlayer
/// </summary>
public class MediaQueue : IMediaQueue
{
private object _lock = new();
private readonly MediaFileUrlSetter _mediaFileUrlSetter;
private readonly IToastDisplayer _toastDisplayer;
private readonly IBMMLanguageBinder _bmmLanguageBinder;
Expand All @@ -42,7 +43,10 @@ public MediaQueue(
public void Replace(IMediaTrack track)
{
_mediaFileUrlSetter.SetLocalPathIfDownloaded(track);
Tracks = new List<IMediaTrack> { track };
lock (_lock)
{
Tracks = new List<IMediaTrack> { track };
}
}

public async Task<bool> Replace(IEnumerable<IMediaTrack> tracks, IMediaTrack currentTrack)
Expand Down Expand Up @@ -75,7 +79,11 @@ await Mvx.IoCProvider.Resolve<IMvxMainThreadAsyncDispatcher>().ExecuteOnMainThre
}
}

Tracks = filteredList;
lock (_lock)
{
Tracks = filteredList;
}

return true;
}

Expand All @@ -84,21 +92,30 @@ public async Task<bool> Append(IMediaTrack track)
if (await FileNotDownloadedButInOfflineViewModel(track))
return false;

Tracks.Add(track);
return true;
lock (_lock)
{
Tracks.Add(track);
return true;
}
}

public async Task<bool> PlayNext(IMediaTrack track, IMediaTrack currentPlayedTrack)
{
var nextPlayedIndex = Tracks.IndexOf(currentPlayedTrack) + 1;

if (Tracks.Count < nextPlayedIndex)
return false;
lock (_lock)
{
if (Tracks.Count < nextPlayedIndex)
return false;
}

if (await FileNotDownloadedButInOfflineViewModel(track))
return false;

Tracks.Insert(nextPlayedIndex, track);
lock (_lock)
{
Tracks.Insert(nextPlayedIndex, track);
}

return true;
}
Expand Down Expand Up @@ -132,48 +149,62 @@ public bool IsSameQueue(IList<IMediaTrack> newMediaTracks)
if (newMediaTracks.Any(t => t.IsLivePlayback))
return false;

if (newMediaTracks.Count != Tracks.Count)
return false;

var comparer = new MediaTrackComparer();
var onlyInNew = newMediaTracks.Except(Tracks, comparer);
var onlyInQueue = Tracks.Except(newMediaTracks, comparer);

bool tracksChanged = onlyInNew.Any() || onlyInQueue.Any();
lock (_lock)
{
if (newMediaTracks.Count != Tracks.Count)
return false;
var comparer = new MediaTrackComparer();

if (newMediaTracks.Count != Tracks.Count)
return false;
var onlyInNew = newMediaTracks.Except(Tracks, comparer);
var onlyInQueue = Tracks.Except(newMediaTracks, comparer);

bool tracksChanged = onlyInNew.Any() || onlyInQueue.Any();

if (tracksChanged)
return false;
if (tracksChanged)
return false;

return CheckAllTracksOnTheSamePosition(newMediaTracks);
return CheckAllTracksOnTheSamePosition(newMediaTracks);
}
}

private bool CheckAllTracksOnTheSamePosition(IList<IMediaTrack> newMediaTracks)
{
bool allTracksOnTheSamePosition = true;

for (int i = 0; i < Tracks.Count; i++)
lock (_lock)
{
var queueTrack = Tracks[i];
var newTrack = newMediaTracks[i];
bool allTracksOnTheSamePosition = true;

if (queueTrack.Equals(newTrack))
continue;
for (int i = 0; i < Tracks.Count; i++)
{
var queueTrack = Tracks[i];
var newTrack = newMediaTracks[i];

allTracksOnTheSamePosition = false;
break;
}
if (queueTrack.Equals(newTrack))
continue;

return allTracksOnTheSamePosition;
allTracksOnTheSamePosition = false;
break;
}

return allTracksOnTheSamePosition;
}
}

public IMediaTrack GetTrackById(int id)
{
return Tracks.FirstOrDefault(t => t.Id == id);
lock (_lock)
{
return Tracks.FirstOrDefault(t => t.Id == id);
}
}

public void Clear()
{
Tracks = new List<IMediaTrack>();
lock (_lock)
{
Tracks = new List<IMediaTrack>();
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,10 @@ public IShuffleOrder CloneAndClear()
private static int[] CreateShuffledListStartingWith(int startIndex, int length, Random random)
{
var list = IndexList(1, length);
if (startIndex != 0)
{

if (startIndex > 0 && startIndex <= list.Count)
list[startIndex - 1] = 0;
}

ShuffleableQueue.ShuffleList(list, random);
return list.Prepend(startIndex).ToArray();
}
Expand Down
Binary file modified lib/FFImageLoading.Droid.dll
Binary file not shown.
Binary file modified lib/FFImageLoading.Shared.dll
Binary file not shown.
Binary file modified lib/FFImageLoading.dll
Binary file not shown.

0 comments on commit 0cc5153

Please sign in to comment.