kopia lustrzana https://github.com/ryukoposting/Signal-Android
Synchronize voice note queue reads and writes.
rodzic
907e8d93a3
commit
2290a6c0df
|
@ -140,56 +140,58 @@ final class VoiceNotePlaybackPreparer implements MediaSessionConnector.PlaybackP
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyDescriptionsToQueue(@NonNull List<MediaDescriptionCompat> descriptions) {
|
private void applyDescriptionsToQueue(@NonNull List<MediaDescriptionCompat> descriptions) {
|
||||||
for (MediaDescriptionCompat description : descriptions) {
|
synchronized (queueDataAdapter) {
|
||||||
int holderIndex = queueDataAdapter.indexOf(description.getMediaUri());
|
for (MediaDescriptionCompat description : descriptions) {
|
||||||
MediaDescriptionCompat next = createNextClone(description);
|
int holderIndex = queueDataAdapter.indexOf(description.getMediaUri());
|
||||||
int currentIndex = player.getCurrentWindowIndex();
|
MediaDescriptionCompat next = createNextClone(description);
|
||||||
|
int currentIndex = player.getCurrentWindowIndex();
|
||||||
|
|
||||||
if (holderIndex != -1) {
|
if (holderIndex != -1) {
|
||||||
queueDataAdapter.remove(holderIndex);
|
|
||||||
|
|
||||||
if (!queueDataAdapter.isEmpty()) {
|
|
||||||
queueDataAdapter.remove(holderIndex);
|
queueDataAdapter.remove(holderIndex);
|
||||||
}
|
|
||||||
|
|
||||||
queueDataAdapter.add(holderIndex, createNextClone(description));
|
if (!queueDataAdapter.isEmpty()) {
|
||||||
queueDataAdapter.add(holderIndex, description);
|
queueDataAdapter.remove(holderIndex);
|
||||||
|
|
||||||
if (currentIndex != holderIndex) {
|
|
||||||
dataSource.removeMediaSource(holderIndex);
|
|
||||||
dataSource.addMediaSource(holderIndex, mediaSourceFactory.createMediaSource(description));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentIndex != holderIndex + 1) {
|
|
||||||
if (dataSource.getSize() > 1) {
|
|
||||||
dataSource.removeMediaSource(holderIndex + 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dataSource.addMediaSource(holderIndex + 1, mediaSourceFactory.createMediaSource(next));
|
queueDataAdapter.add(holderIndex, createNextClone(description));
|
||||||
|
queueDataAdapter.add(holderIndex, description);
|
||||||
|
|
||||||
|
if (currentIndex != holderIndex) {
|
||||||
|
dataSource.removeMediaSource(holderIndex);
|
||||||
|
dataSource.addMediaSource(holderIndex, mediaSourceFactory.createMediaSource(description));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentIndex != holderIndex + 1) {
|
||||||
|
if (dataSource.getSize() > 1) {
|
||||||
|
dataSource.removeMediaSource(holderIndex + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
dataSource.addMediaSource(holderIndex + 1, mediaSourceFactory.createMediaSource(next));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int insertLocation = queueDataAdapter.indexAfter(description);
|
||||||
|
|
||||||
|
queueDataAdapter.add(insertLocation, next);
|
||||||
|
queueDataAdapter.add(insertLocation, description);
|
||||||
|
|
||||||
|
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(next));
|
||||||
|
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(description));
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
int insertLocation = queueDataAdapter.indexAfter(description);
|
|
||||||
|
|
||||||
queueDataAdapter.add(insertLocation, next);
|
|
||||||
queueDataAdapter.add(insertLocation, description);
|
|
||||||
|
|
||||||
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(next));
|
|
||||||
dataSource.addMediaSource(insertLocation, mediaSourceFactory.createMediaSource(description));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
int lastIndex = queueDataAdapter.size() - 1;
|
int lastIndex = queueDataAdapter.size() - 1;
|
||||||
MediaDescriptionCompat last = queueDataAdapter.getMediaDescription(lastIndex);
|
MediaDescriptionCompat last = queueDataAdapter.getMediaDescription(lastIndex);
|
||||||
|
|
||||||
if (Objects.equals(last.getMediaUri(), NEXT_URI)) {
|
if (Objects.equals(last.getMediaUri(), NEXT_URI)) {
|
||||||
queueDataAdapter.remove(lastIndex);
|
queueDataAdapter.remove(lastIndex);
|
||||||
dataSource.removeMediaSource(lastIndex);
|
dataSource.removeMediaSource(lastIndex);
|
||||||
|
|
||||||
if (queueDataAdapter.size() > 1) {
|
if (queueDataAdapter.size() > 1) {
|
||||||
MediaDescriptionCompat end = createEndClone(last);
|
MediaDescriptionCompat end = createEndClone(last);
|
||||||
|
|
||||||
queueDataAdapter.add(lastIndex, end);
|
queueDataAdapter.add(lastIndex, end);
|
||||||
dataSource.addMediaSource(lastIndex, mediaSourceFactory.createMediaSource(end));
|
dataSource.addMediaSource(lastIndex, mediaSourceFactory.createMediaSource(end));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,31 +20,31 @@ final class VoiceNoteQueueDataAdapter implements TimelineQueueEditor.QueueDataAd
|
||||||
private final List<MediaDescriptionCompat> descriptions = new LinkedList<>();
|
private final List<MediaDescriptionCompat> descriptions = new LinkedList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MediaDescriptionCompat getMediaDescription(int position) {
|
public synchronized MediaDescriptionCompat getMediaDescription(int position) {
|
||||||
return descriptions.get(position);
|
return descriptions.get(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void add(int position, MediaDescriptionCompat description) {
|
public synchronized void add(int position, MediaDescriptionCompat description) {
|
||||||
descriptions.add(position, description);
|
descriptions.add(position, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void remove(int position) {
|
public synchronized void remove(int position) {
|
||||||
descriptions.remove(position);
|
descriptions.remove(position);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void move(int from, int to) {
|
public synchronized void move(int from, int to) {
|
||||||
MediaDescriptionCompat description = descriptions.remove(from);
|
MediaDescriptionCompat description = descriptions.remove(from);
|
||||||
descriptions.add(to, description);
|
descriptions.add(to, description);
|
||||||
}
|
}
|
||||||
|
|
||||||
int size() {
|
synchronized int size() {
|
||||||
return descriptions.size();
|
return descriptions.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
int indexOf(@NonNull Uri uri) {
|
synchronized int indexOf(@NonNull Uri uri) {
|
||||||
for (int i = 0; i < descriptions.size(); i++) {
|
for (int i = 0; i < descriptions.size(); i++) {
|
||||||
if (Objects.equals(uri, descriptions.get(i).getMediaUri())) {
|
if (Objects.equals(uri, descriptions.get(i).getMediaUri())) {
|
||||||
return i;
|
return i;
|
||||||
|
@ -54,7 +54,7 @@ final class VoiceNoteQueueDataAdapter implements TimelineQueueEditor.QueueDataAd
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int indexAfter(@NonNull MediaDescriptionCompat target) {
|
synchronized int indexAfter(@NonNull MediaDescriptionCompat target) {
|
||||||
if (isEmpty()) {
|
if (isEmpty()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -71,11 +71,11 @@ final class VoiceNoteQueueDataAdapter implements TimelineQueueEditor.QueueDataAd
|
||||||
return descriptions.size();
|
return descriptions.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isEmpty() {
|
synchronized boolean isEmpty() {
|
||||||
return descriptions.isEmpty();
|
return descriptions.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
void clear() {
|
synchronized void clear() {
|
||||||
descriptions.clear();
|
descriptions.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue