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) {
animateColorChange(color);
playbackControlsFragment.setDark(ColorUtil.isColorLight(color));
playbackControlsFragment.updateBufferingIndicatorColor(ColorUtil.invertColor(color));
getCallbacks().onPaletteColorChanged();
}

View file

@ -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() {

View file

@ -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();

View file

@ -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,27 +53,13 @@ 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));
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 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
@ -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);

View file

@ -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,12 +1036,13 @@ 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);
if (playWhenReady && playbackState == Player.STATE_READY) {
progressHandler.sendEmptyMessage(TRACK_STARTED);
prepareNext();
}
}
@Override
public void onTrackWentToNext() {

View file

@ -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();

View file

@ -122,6 +122,11 @@
app:elevation="4dp"
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>
</LinearLayout>