From f39891dd2cfa5c883ce78f86fa83bf780bfffc2a Mon Sep 17 00:00:00 2001 From: eddyizm Date: Mon, 29 Dec 2025 16:37:20 -0800 Subject: [PATCH] wip: added logging to media manager to track down bug in bottom sheet dialogs --- .../tempo/service/MediaManager.java | 22 ++++++- .../AlbumBottomSheetDialog.java | 58 ++++++++++++------- .../ArtistBottomSheetDialog.java | 48 +++++++++++---- 3 files changed, 91 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java b/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java index f3139186..12ae3e85 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java +++ b/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java @@ -184,41 +184,57 @@ public class MediaManager { @OptIn(markerClass = UnstableApi.class) public static void startQueue(ListenableFuture mediaBrowserListenableFuture, List media, int startIndex) { if (mediaBrowserListenableFuture != null) { + Log.d(TAG, "startQueue called with " + (media != null ? media.size() : 0) + " songs"); + mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { + Log.d(TAG, "MediaBrowser future is done"); final MediaBrowser browser = mediaBrowserListenableFuture.get(); + Log.d(TAG, "Got MediaBrowser, connected: " + browser.isConnected()); + final List items = MappingUtil.mapMediaItems(media); + Log.d(TAG, "Mapped " + items.size() + " media items"); + new Handler(Looper.getMainLooper()).post(() -> { + Log.d(TAG, "Setting " + items.size() + " media items at index " + startIndex); justStarted.set(true); browser.setMediaItems(items, startIndex, 0); browser.prepare(); + Log.d(TAG, "setMediaItems and prepare called"); Player.Listener timelineListener = new Player.Listener() { @Override public void onTimelineChanged(Timeline timeline, int reason) { + Log.d(TAG, "onTimelineChanged: itemCount=" + browser.getMediaItemCount() + ", reason=" + reason); + int itemCount = browser.getMediaItemCount(); if (itemCount > 0 && startIndex >= 0 && startIndex < itemCount) { + Log.d(TAG, "Seeking to " + startIndex + " and playing"); browser.seekTo(startIndex, 0); browser.play(); browser.removeListener(this); + Log.d(TAG, "Playback started"); + } else { + Log.d(TAG, "Cannot start playback: itemCount=" + itemCount + ", startIndex=" + startIndex); } } }; + + Log.d(TAG, "Adding timeline listener"); browser.addListener(timelineListener); }); backgroundExecutor.execute(() -> { + Log.d(TAG, "Background: enqueuing to database"); enqueueDatabase(media, true, 0); }); } } catch (ExecutionException | InterruptedException e) { - Log.e(TAG, "Error executing startQueue logic: " + e.getMessage(), e); + Log.e(TAG, "Error in startQueue: " + e.getMessage(), e); } }, MoreExecutors.directExecutor()); } - - } public static void startQueue(ListenableFuture mediaBrowserListenableFuture, Child media) { diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index 5db3add0..072fa391 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -116,33 +116,47 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements favoriteToggle.setOnClickListener(v -> albumBottomSheetViewModel.setFavorite(requireContext())); TextView playRadio = view.findViewById(R.id.play_radio_text_view); - playRadio.setOnClickListener(v -> { - AlbumRepository albumRepository = new AlbumRepository(); - albumRepository.getInstantMix(album, 20, new MediaCallback() { - @Override - public void onError(Exception exception) { - exception.printStackTrace(); - } - - @Override - public void onLoadMedia(List media) { - if (!isAdded() || getActivity() == null) { - return; + playRadio.setOnClickListener(v -> { + AlbumRepository albumRepository = new AlbumRepository(); + albumRepository.getInstantMix(album, 20, new MediaCallback() { + @Override + public void onError(Exception exception) { + exception.printStackTrace(); } - MusicUtil.ratingFilter((ArrayList) media); - - if (!media.isEmpty()) { - MediaManager.startQueue(mediaBrowserListenableFuture, (ArrayList) media, 0); - if (getActivity() instanceof MainActivity) { - ((MainActivity) getActivity()).setBottomSheetInPeek(true); + @Override + public void onLoadMedia(List media) { + if (!isAdded() || getActivity() == null) { + return; } - } - dismissBottomSheet(); - } + MusicUtil.ratingFilter((ArrayList) media); + + if (!media.isEmpty()) { + MediaManager.startQueue(mediaBrowserListenableFuture, (ArrayList) media, 0); + if (getActivity() instanceof MainActivity) { + ((MainActivity) getActivity()).setBottomSheetInPeek(true); + } + } + + view.postDelayed(() -> { + try { + if (mediaBrowserListenableFuture.isDone()) { + MediaBrowser browser = mediaBrowserListenableFuture.get(); + if (browser != null && browser.isPlaying()) { + dismissBottomSheet(); + return; + } + } + } catch (Exception e) { + // Ignore + } + view.postDelayed(() -> dismissBottomSheet(), 200); + }, 300); + } + }); }); - }); + TextView playRandom = view.findViewById(R.id.play_random_text_view); playRandom.setOnClickListener(v -> { AlbumRepository albumRepository = new AlbumRepository(); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java index e890c10e..2f48e4dc 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java @@ -2,11 +2,13 @@ package com.cappielloantonio.tempo.ui.fragment.bottomsheetdialog; import android.content.ComponentName; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import android.widget.ToggleButton; import androidx.annotation.Nullable; @@ -89,21 +91,43 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement TextView playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { + Log.d(TAG, "Artist instant mix clicked"); + ArtistRepository artistRepository = new ArtistRepository(); - Observer> observer = new Observer>() { - @Override - public void onChanged(List songs) { - if (songs != null && !songs.isEmpty() && isAdded()) { - MusicUtil.ratingFilter(songs); - MediaManager.startQueue(mediaBrowserListenableFuture, songs, 0); - ((MainActivity) requireActivity()).setBottomSheetInPeek(true); - artistRepository.getInstantMix(artist, 20).removeObserver(this); + artistRepository.getInstantMix(artist, 20) + .observe(getViewLifecycleOwner(), new androidx.lifecycle.Observer>() { + @Override + public void onChanged(List songs) { + if (songs != null && !songs.isEmpty()) { + Log.d(TAG, "Starting queue with " + songs.size() + " songs"); + MusicUtil.ratingFilter(songs); + MediaManager.startQueue(mediaBrowserListenableFuture, songs, 0); + ((MainActivity) requireActivity()).setBottomSheetInPeek(true); + artistRepository.getInstantMix(artist, 20) + .removeObserver(this); + view.postDelayed(() -> { + try { + if (mediaBrowserListenableFuture.isDone()) { + MediaBrowser browser = mediaBrowserListenableFuture.get(); + if (browser != null && browser.isPlaying()) { + dismissBottomSheet(); + return; + } + } + } catch (Exception e) { + // Ignore + } + view.postDelayed(() -> dismissBottomSheet(), 200); + }, 300); + } else { + // No songs at all - all attempts failed + Toast.makeText(requireContext(), + "Could not load songs. Please check your connection.", + Toast.LENGTH_SHORT).show(); dismissBottomSheet(); } - } - }; - - artistRepository.getInstantMix(artist, 20).observe(getViewLifecycleOwner(), observer); + } + }); }); TextView playRandom = view.findViewById(R.id.play_random_text_view);