diff --git a/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerFragment.java b/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerFragment.java index bf4e453a..56462e64 100644 --- a/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerFragment.java @@ -274,6 +274,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum public void onColorChanged(int color) { animateColorChange(color); playbackControlsFragment.setDark(ColorUtil.isColorLight(color)); + playbackControlsFragment.updateBufferingIndicatorColor(ColorUtil.invertColor(color)); getCallbacks().onPaletteColorChanged(); } diff --git a/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerPlaybackControlsFragment.java b/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerPlaybackControlsFragment.java index 27ca838e..a422bce0 100644 --- a/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerPlaybackControlsFragment.java +++ b/app/src/main/java/com/dkanada/gramophone/fragments/player/card/CardPlayerPlaybackControlsFragment.java @@ -1,5 +1,6 @@ package com.dkanada.gramophone.fragments.player.card; +import android.content.res.ColorStateList; import android.graphics.Color; import android.graphics.PorterDuff; import android.os.Bundle; @@ -11,19 +12,19 @@ import android.widget.SeekBar; import androidx.annotation.NonNull; -import com.kabouzeid.appthemehelper.util.ColorUtil; -import com.kabouzeid.appthemehelper.util.MaterialValueHelper; -import com.kabouzeid.appthemehelper.util.TintHelper; import com.dkanada.gramophone.R; -import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.databinding.FragmentCardPlayerPlaybackControlsBinding; +import com.dkanada.gramophone.fragments.AbsMusicServiceFragment; +import com.dkanada.gramophone.helper.MusicPlayerRemote; import com.dkanada.gramophone.helper.MusicProgressViewUpdateHelper; import com.dkanada.gramophone.helper.PlayPauseButtonOnClickHandler; import com.dkanada.gramophone.misc.SimpleOnSeekbarChangeListener; import com.dkanada.gramophone.service.MusicService; -import com.dkanada.gramophone.fragments.AbsMusicServiceFragment; import com.dkanada.gramophone.util.MusicUtil; import com.dkanada.gramophone.views.PlayPauseDrawable; +import com.kabouzeid.appthemehelper.util.ColorUtil; +import com.kabouzeid.appthemehelper.util.MaterialValueHelper; +import com.kabouzeid.appthemehelper.util.TintHelper; public class CardPlayerPlaybackControlsFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback { @@ -133,6 +134,11 @@ public class CardPlayerPlaybackControlsFragment extends AbsMusicServiceFragment } else { playerFabPlayPauseDrawable.setPlay(animate); } + binding.playerBufferingIndicator.setVisibility(MusicPlayerRemote.isBuffering() ? View.VISIBLE : View.GONE); + } + + public void updateBufferingIndicatorColor(int color) { + binding.playerBufferingIndicator.setIndeterminateTintList(ColorStateList.valueOf(color)); } private void setUpMusicControllers() { diff --git a/app/src/main/java/com/dkanada/gramophone/helper/MusicPlayerRemote.java b/app/src/main/java/com/dkanada/gramophone/helper/MusicPlayerRemote.java index f13938e0..292df944 100644 --- a/app/src/main/java/com/dkanada/gramophone/helper/MusicPlayerRemote.java +++ b/app/src/main/java/com/dkanada/gramophone/helper/MusicPlayerRemote.java @@ -136,6 +136,10 @@ public class MusicPlayerRemote { return musicService != null && musicService.isPlaying(); } + public static boolean isBuffering() { + return musicService != null && musicService.isBuffering(); + } + public static void resumePlaying() { if (musicService != null) { musicService.play(); diff --git a/app/src/main/java/com/dkanada/gramophone/service/MultiPlayer.java b/app/src/main/java/com/dkanada/gramophone/service/MultiPlayer.java index b0386073..cf74a75f 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/MultiPlayer.java +++ b/app/src/main/java/com/dkanada/gramophone/service/MultiPlayer.java @@ -12,7 +12,6 @@ import com.dkanada.gramophone.util.MusicUtil; import com.dkanada.gramophone.util.PreferenceUtil; import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlayer; -import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.database.ExoDatabaseProvider; @@ -54,29 +53,15 @@ public class MultiPlayer implements Playback { private PlaybackCallbacks callbacks; private final ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() { - @Override - public void onIsLoadingChanged(boolean isLoading) { - Log.i(TAG, String.format("onIsLoadingChanged: %b", isLoading)); - } @Override - public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { - Log.i(TAG, String.format("onPlayWhenReadyChanged: %b %d", playWhenReady, reason)); - } - - @Override - public void onPlaybackStateChanged(int playbackState) { - Log.i(TAG, String.format("onPlaybackStateChanged: %d", playbackState)); - if (callbacks != null && exoPlayer.isPlaying()) { - callbacks.onTrackStarted(); + public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { + Log.i(TAG, String.format("onPlayerStateChanged: %b %d", playWhenReady, playbackState)); + if (callbacks != null) { + callbacks.onPlayerStateChanged(playWhenReady, playbackState); } } - @Override - public void onMediaItemTransition(MediaItem mediaItem, int reason) { - Log.i(TAG, String.format("onMediaItemTransition: %s %d", mediaItem, reason)); - } - @Override public void onPositionDiscontinuity(int reason) { Log.i(TAG, String.format("onPositionDiscontinuity: %d", reason)); @@ -203,6 +188,11 @@ public class MultiPlayer implements Playback { return exoPlayer.isPlaying() || exoPlayer.getPlayWhenReady(); } + @Override + public boolean isBuffering() { + return exoPlayer.getPlaybackState() == Player.STATE_BUFFERING; + } + @Override public void start() { exoPlayer.setPlayWhenReady(true); diff --git a/app/src/main/java/com/dkanada/gramophone/service/MusicService.java b/app/src/main/java/com/dkanada/gramophone/service/MusicService.java index b1ec5c71..79ffc13e 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/MusicService.java +++ b/app/src/main/java/com/dkanada/gramophone/service/MusicService.java @@ -51,6 +51,7 @@ import com.dkanada.gramophone.util.Util; import com.dkanada.gramophone.widgets.AppWidgetAlbum; import com.dkanada.gramophone.widgets.AppWidgetCard; import com.dkanada.gramophone.widgets.AppWidgetClassic; +import com.google.android.exoplayer2.Player; import org.jellyfin.apiclient.interaction.EmptyResponse; import org.jellyfin.apiclient.interaction.Response; @@ -60,7 +61,6 @@ import org.jellyfin.apiclient.model.session.PlaybackStopInfo; import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Random; @@ -483,6 +483,10 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP return playback != null && playback.isPlaying(); } + public boolean isBuffering() { + return playback != null && playback.isBuffering(); + } + public int getPosition() { return position; } @@ -1032,11 +1036,12 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP } @Override - public void onTrackStarted() { - progressHandler.sendEmptyMessage(TRACK_STARTED); - + public void onPlayerStateChanged(boolean playWhenReady, int playbackState) { notifyChange(STATE_CHANGED); - prepareNext(); + if (playWhenReady && playbackState == Player.STATE_READY) { + progressHandler.sendEmptyMessage(TRACK_STARTED); + prepareNext(); + } } @Override diff --git a/app/src/main/java/com/dkanada/gramophone/service/playback/Playback.java b/app/src/main/java/com/dkanada/gramophone/service/playback/Playback.java index d99ce93f..c34fe682 100644 --- a/app/src/main/java/com/dkanada/gramophone/service/playback/Playback.java +++ b/app/src/main/java/com/dkanada/gramophone/service/playback/Playback.java @@ -13,6 +13,8 @@ public interface Playback { boolean isPlaying(); + boolean isBuffering(); + void start(); void pause(); @@ -30,7 +32,7 @@ public interface Playback { int getVolume(); interface PlaybackCallbacks { - void onTrackStarted(); + void onPlayerStateChanged(boolean playWhenReady, int playbackState); void onTrackWentToNext(); diff --git a/app/src/main/res/layout/fragment_card_player_playback_controls.xml b/app/src/main/res/layout/fragment_card_player_playback_controls.xml index 5517d271..ab8777dc 100644 --- a/app/src/main/res/layout/fragment_card_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_card_player_playback_controls.xml @@ -122,6 +122,11 @@ app:elevation="4dp" app:pressedTranslationZ="2dp" /> +