Add buffering indicator
This commit is contained in:
parent
12443be2ce
commit
f668e51ba3
7 changed files with 43 additions and 30 deletions
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue