Fix/start queue blocking UI (#283)

This commit is contained in:
eddyizm 2025-11-23 09:36:31 -08:00 committed by GitHub
commit a5065578ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2,6 +2,8 @@ package com.cappielloantonio.tempo.service;
import android.content.ComponentName; import android.content.ComponentName;
import android.util.Log; import android.util.Log;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -36,6 +38,8 @@ import com.google.common.util.concurrent.MoreExecutors;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
public class MediaManager { public class MediaManager {
@ -43,6 +47,8 @@ public class MediaManager {
private static WeakReference<MediaBrowser> attachedBrowserRef = new WeakReference<>(null); private static WeakReference<MediaBrowser> attachedBrowserRef = new WeakReference<>(null);
public static AtomicBoolean justStarted = new AtomicBoolean(false); public static AtomicBoolean justStarted = new AtomicBoolean(false);
private static final ExecutorService backgroundExecutor = Executors.newSingleThreadExecutor();
public static void registerPlaybackObserver( public static void registerPlaybackObserver(
ListenableFuture<MediaBrowser> browserFuture, ListenableFuture<MediaBrowser> browserFuture,
PlaybackViewModel playbackViewModel PlaybackViewModel playbackViewModel
@ -175,36 +181,43 @@ public class MediaManager {
} }
} }
@OptIn(markerClass = UnstableApi.class)
public static void startQueue(ListenableFuture<MediaBrowser> mediaBrowserListenableFuture, List<Child> media, int startIndex) { public static void startQueue(ListenableFuture<MediaBrowser> mediaBrowserListenableFuture, List<Child> media, int startIndex) {
if (mediaBrowserListenableFuture != null) { if (mediaBrowserListenableFuture != null) {
mediaBrowserListenableFuture.addListener(() -> { mediaBrowserListenableFuture.addListener(() -> {
try { try {
if (mediaBrowserListenableFuture.isDone()) { if (mediaBrowserListenableFuture.isDone()) {
MediaBrowser browser = mediaBrowserListenableFuture.get(); final MediaBrowser browser = mediaBrowserListenableFuture.get();
justStarted.set(true);
browser.setMediaItems(MappingUtil.mapMediaItems(media), startIndex, 0);
browser.prepare();
Player.Listener timelineListener = new Player.Listener() { backgroundExecutor.execute(() -> {
@Override final List<MediaItem> items = MappingUtil.mapMediaItems(media);
public void onTimelineChanged(Timeline timeline, int reason) { enqueueDatabase(media, true, 0);
int itemCount = browser.getMediaItemCount(); new Handler(Looper.getMainLooper()).post(() -> {
if (itemCount > 0 && startIndex >= 0 && startIndex < itemCount) { justStarted.set(true);
browser.seekTo(startIndex, 0); browser.setMediaItems(items, startIndex, 0);
browser.play(); browser.prepare();
browser.removeListener(this); Player.Listener timelineListener = new Player.Listener() {
} @Override
} public void onTimelineChanged(Timeline timeline, int reason) {
}; int itemCount = browser.getMediaItemCount();
browser.addListener(timelineListener); if (itemCount > 0 && startIndex >= 0 && startIndex < itemCount) {
browser.seekTo(startIndex, 0);
enqueueDatabase(media, true, 0); browser.play();
browser.removeListener(this);
}
}
};
browser.addListener(timelineListener);
});
});
} }
} catch (ExecutionException | InterruptedException e) { } catch (ExecutionException | InterruptedException e) {
e.printStackTrace(); Log.e(TAG, "Error executing startQueue logic: " + e.getMessage(), e);
} }
}, MoreExecutors.directExecutor()); }, MoreExecutors.directExecutor());
} }
} }
public static void startQueue(ListenableFuture<MediaBrowser> mediaBrowserListenableFuture, Child media) { public static void startQueue(ListenableFuture<MediaBrowser> mediaBrowserListenableFuture, Child media) {