Add buffering indicator

This commit is contained in:
Maxr1998 2020-12-21 20:36:34 +01:00
commit f668e51ba3
No known key found for this signature in database
GPG key ID: 3BA0CD3A11CDF7B8
7 changed files with 43 additions and 30 deletions

View file

@ -274,6 +274,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum
public void onColorChanged(int color) { public void onColorChanged(int color) {
animateColorChange(color); animateColorChange(color);
playbackControlsFragment.setDark(ColorUtil.isColorLight(color)); playbackControlsFragment.setDark(ColorUtil.isColorLight(color));
playbackControlsFragment.updateBufferingIndicatorColor(ColorUtil.invertColor(color));
getCallbacks().onPaletteColorChanged(); getCallbacks().onPaletteColorChanged();
} }

View file

@ -1,5 +1,6 @@
package com.dkanada.gramophone.fragments.player.card; package com.dkanada.gramophone.fragments.player.card;
import android.content.res.ColorStateList;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.os.Bundle; import android.os.Bundle;
@ -11,19 +12,19 @@ import android.widget.SeekBar;
import androidx.annotation.NonNull; 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.R;
import com.dkanada.gramophone.helper.MusicPlayerRemote;
import com.dkanada.gramophone.databinding.FragmentCardPlayerPlaybackControlsBinding; 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.MusicProgressViewUpdateHelper;
import com.dkanada.gramophone.helper.PlayPauseButtonOnClickHandler; import com.dkanada.gramophone.helper.PlayPauseButtonOnClickHandler;
import com.dkanada.gramophone.misc.SimpleOnSeekbarChangeListener; import com.dkanada.gramophone.misc.SimpleOnSeekbarChangeListener;
import com.dkanada.gramophone.service.MusicService; import com.dkanada.gramophone.service.MusicService;
import com.dkanada.gramophone.fragments.AbsMusicServiceFragment;
import com.dkanada.gramophone.util.MusicUtil; import com.dkanada.gramophone.util.MusicUtil;
import com.dkanada.gramophone.views.PlayPauseDrawable; 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 { public class CardPlayerPlaybackControlsFragment extends AbsMusicServiceFragment implements MusicProgressViewUpdateHelper.Callback {
@ -133,6 +134,11 @@ public class CardPlayerPlaybackControlsFragment extends AbsMusicServiceFragment
} else { } else {
playerFabPlayPauseDrawable.setPlay(animate); 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() { private void setUpMusicControllers() {

View file

@ -136,6 +136,10 @@ public class MusicPlayerRemote {
return musicService != null && musicService.isPlaying(); return musicService != null && musicService.isPlaying();
} }
public static boolean isBuffering() {
return musicService != null && musicService.isBuffering();
}
public static void resumePlaying() { public static void resumePlaying() {
if (musicService != null) { if (musicService != null) {
musicService.play(); musicService.play();

View file

@ -12,7 +12,6 @@ import com.dkanada.gramophone.util.MusicUtil;
import com.dkanada.gramophone.util.PreferenceUtil; import com.dkanada.gramophone.util.PreferenceUtil;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.database.ExoDatabaseProvider; import com.google.android.exoplayer2.database.ExoDatabaseProvider;
@ -54,27 +53,13 @@ public class MultiPlayer implements Playback {
private PlaybackCallbacks callbacks; private PlaybackCallbacks callbacks;
private final ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() { private final ExoPlayer.EventListener eventListener = new ExoPlayer.EventListener() {
@Override
public void onIsLoadingChanged(boolean isLoading) {
Log.i(TAG, String.format("onIsLoadingChanged: %b", isLoading));
}
@Override @Override
public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) { public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
Log.i(TAG, String.format("onPlayWhenReadyChanged: %b %d", playWhenReady, reason)); Log.i(TAG, String.format("onPlayerStateChanged: %b %d", playWhenReady, playbackState));
if (callbacks != null) {
callbacks.onPlayerStateChanged(playWhenReady, playbackState);
} }
@Override
public void onPlaybackStateChanged(int playbackState) {
Log.i(TAG, String.format("onPlaybackStateChanged: %d", playbackState));
if (callbacks != null && exoPlayer.isPlaying()) {
callbacks.onTrackStarted();
}
}
@Override
public void onMediaItemTransition(MediaItem mediaItem, int reason) {
Log.i(TAG, String.format("onMediaItemTransition: %s %d", mediaItem, reason));
} }
@Override @Override
@ -203,6 +188,11 @@ public class MultiPlayer implements Playback {
return exoPlayer.isPlaying() || exoPlayer.getPlayWhenReady(); return exoPlayer.isPlaying() || exoPlayer.getPlayWhenReady();
} }
@Override
public boolean isBuffering() {
return exoPlayer.getPlaybackState() == Player.STATE_BUFFERING;
}
@Override @Override
public void start() { public void start() {
exoPlayer.setPlayWhenReady(true); exoPlayer.setPlayWhenReady(true);

View file

@ -51,6 +51,7 @@ import com.dkanada.gramophone.util.Util;
import com.dkanada.gramophone.widgets.AppWidgetAlbum; import com.dkanada.gramophone.widgets.AppWidgetAlbum;
import com.dkanada.gramophone.widgets.AppWidgetCard; import com.dkanada.gramophone.widgets.AppWidgetCard;
import com.dkanada.gramophone.widgets.AppWidgetClassic; import com.dkanada.gramophone.widgets.AppWidgetClassic;
import com.google.android.exoplayer2.Player;
import org.jellyfin.apiclient.interaction.EmptyResponse; import org.jellyfin.apiclient.interaction.EmptyResponse;
import org.jellyfin.apiclient.interaction.Response; import org.jellyfin.apiclient.interaction.Response;
@ -60,7 +61,6 @@ import org.jellyfin.apiclient.model.session.PlaybackStopInfo;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
@ -483,6 +483,10 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
return playback != null && playback.isPlaying(); return playback != null && playback.isPlaying();
} }
public boolean isBuffering() {
return playback != null && playback.isBuffering();
}
public int getPosition() { public int getPosition() {
return position; return position;
} }
@ -1032,12 +1036,13 @@ public class MusicService extends Service implements SharedPreferences.OnSharedP
} }
@Override @Override
public void onTrackStarted() { public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
progressHandler.sendEmptyMessage(TRACK_STARTED);
notifyChange(STATE_CHANGED); notifyChange(STATE_CHANGED);
if (playWhenReady && playbackState == Player.STATE_READY) {
progressHandler.sendEmptyMessage(TRACK_STARTED);
prepareNext(); prepareNext();
} }
}
@Override @Override
public void onTrackWentToNext() { public void onTrackWentToNext() {

View file

@ -13,6 +13,8 @@ public interface Playback {
boolean isPlaying(); boolean isPlaying();
boolean isBuffering();
void start(); void start();
void pause(); void pause();
@ -30,7 +32,7 @@ public interface Playback {
int getVolume(); int getVolume();
interface PlaybackCallbacks { interface PlaybackCallbacks {
void onTrackStarted(); void onPlayerStateChanged(boolean playWhenReady, int playbackState);
void onTrackWentToNext(); void onTrackWentToNext();

View file

@ -122,6 +122,11 @@
app:elevation="4dp" app:elevation="4dp"
app:pressedTranslationZ="2dp" /> app:pressedTranslationZ="2dp" />
<me.zhanghai.android.materialprogressbar.MaterialProgressBar
android:id="@+id/player_buffering_indicator"
android:layout_width="74dp"
android:layout_height="74dp"
android:layout_centerInParent="true" />
</RelativeLayout> </RelativeLayout>
</LinearLayout> </LinearLayout>