mirror of
https://github.com/mediathekview/zapp.git
synced 2024-09-20 20:23:04 +02:00
Restore buffering ui
This commit is contained in:
parent
4d792fe262
commit
b7061331b3
@ -93,6 +93,9 @@ dependencies {
|
||||
// joda time
|
||||
implementation 'joda-time:joda-time:2.10'
|
||||
|
||||
// rxjava
|
||||
implementation "io.reactivex.rxjava2:rxjava:2.2.2"
|
||||
|
||||
// about libraries view
|
||||
implementation('com.mikepenz:aboutlibraries:6.2.0@aar') {
|
||||
transitive = true
|
||||
|
@ -35,12 +35,13 @@ import de.christinecoenen.code.zapp.utils.system.MultiWindowHelper;
|
||||
import de.christinecoenen.code.zapp.utils.video.SwipeablePlayerView;
|
||||
import de.christinecoenen.code.zapp.utils.video.VideoBufferingHandler;
|
||||
import de.christinecoenen.code.zapp.utils.video.VideoErrorHandler;
|
||||
import io.reactivex.disposables.CompositeDisposable;
|
||||
import io.reactivex.disposables.Disposable;
|
||||
import timber.log.Timber;
|
||||
|
||||
public class MediathekPlayerActivity extends AppCompatActivity implements
|
||||
PlayerControlView.VisibilityListener,
|
||||
VideoErrorHandler.IVideoErrorListener,
|
||||
VideoBufferingHandler.IVideoBufferingListener {
|
||||
VideoErrorHandler.IVideoErrorListener {
|
||||
|
||||
private static final String EXTRA_SHOW = "de.christinecoenen.code.zapp.EXTRA_SHOW";
|
||||
private static final String ARG_VIDEO_MILLIS = "ARG_VIDEO_MILLIS";
|
||||
@ -74,6 +75,7 @@ public class MediathekPlayerActivity extends AppCompatActivity implements
|
||||
@BindView(R.id.progress)
|
||||
protected ProgressBar loadingIndicator;
|
||||
|
||||
private final CompositeDisposable disposable = new CompositeDisposable();
|
||||
private MediathekShow show;
|
||||
private Player player;
|
||||
private BackgroundPlayerService.Binder binder;
|
||||
@ -89,6 +91,10 @@ public class MediathekPlayerActivity extends AppCompatActivity implements
|
||||
player.load(VideoInfo.fromShow(show));
|
||||
player.resume();
|
||||
|
||||
Disposable bufferingDisposable = player.isBuffering()
|
||||
.subscribe(MediathekPlayerActivity.this::onBufferingChanged, Timber::e);
|
||||
disposable.add(bufferingDisposable);
|
||||
|
||||
binder.movePlaybackToForeground();
|
||||
|
||||
updateSubtitleButtons();
|
||||
@ -250,7 +256,7 @@ public class MediathekPlayerActivity extends AppCompatActivity implements
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: get handler to work again
|
||||
// TODO: get error handler to work again
|
||||
@Override
|
||||
public void onVideoError(int messageResourceId) {
|
||||
showError(messageResourceId);
|
||||
@ -261,19 +267,8 @@ public class MediathekPlayerActivity extends AppCompatActivity implements
|
||||
hideError();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBufferingStarted() {
|
||||
loadingIndicator.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBufferingEnded() {
|
||||
loadingIndicator.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onVideoEnded() {
|
||||
|
||||
private void onBufferingChanged(boolean isBuffering) {
|
||||
loadingIndicator.setVisibility(isBuffering ? View.VISIBLE : View.INVISIBLE);
|
||||
}
|
||||
|
||||
@OnClick(R.id.btn_caption_disable)
|
||||
@ -295,6 +290,7 @@ public class MediathekPlayerActivity extends AppCompatActivity implements
|
||||
}
|
||||
|
||||
private void pauseActivity() {
|
||||
disposable.clear();
|
||||
unbindService(backgroundPlayerServiceConnection);
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,7 @@
|
||||
package de.christinecoenen.code.zapp.app.player;
|
||||
|
||||
public interface IVideoBufferingListener {
|
||||
void onBufferingStarted();
|
||||
|
||||
void onBufferingEnded();
|
||||
}
|
@ -21,11 +21,13 @@ import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
|
||||
import com.google.android.exoplayer2.util.Util;
|
||||
|
||||
import de.christinecoenen.code.zapp.R;
|
||||
import io.reactivex.Observable;
|
||||
|
||||
public class Player {
|
||||
|
||||
private final SimpleExoPlayer player;
|
||||
private final DefaultDataSourceFactory dataSourceFactory;
|
||||
private final PlayerEventHandler playerEventHandler;
|
||||
private VideoInfo currentVideoInfo;
|
||||
private MediaSessionCompat mediaSession;
|
||||
|
||||
@ -51,6 +53,9 @@ public class Player {
|
||||
.setContentType(C.CONTENT_TYPE_MOVIE)
|
||||
.build();
|
||||
player.setAudioAttributes(audioAttributes, true);
|
||||
|
||||
playerEventHandler = new PlayerEventHandler();
|
||||
player.addAnalyticsListener(playerEventHandler);
|
||||
}
|
||||
|
||||
public void setView(PlayerView videoView) {
|
||||
@ -98,6 +103,10 @@ public class Player {
|
||||
return player.getCurrentPosition();
|
||||
}
|
||||
|
||||
public Observable<Boolean> isBuffering() {
|
||||
return playerEventHandler.isBuffering();
|
||||
}
|
||||
|
||||
SimpleExoPlayer getExoPlayer() {
|
||||
return player;
|
||||
}
|
||||
@ -112,5 +121,6 @@ public class Player {
|
||||
|
||||
void destroy() {
|
||||
player.release();
|
||||
mediaSession.release();
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,25 @@
|
||||
package de.christinecoenen.code.zapp.app.player;
|
||||
|
||||
import com.google.android.exoplayer2.Player;
|
||||
import com.google.android.exoplayer2.analytics.AnalyticsListener;
|
||||
|
||||
import io.reactivex.Observable;
|
||||
import io.reactivex.subjects.BehaviorSubject;
|
||||
|
||||
/**
|
||||
* Transforms player events from exo player into RXJava observables.
|
||||
*/
|
||||
class PlayerEventHandler implements AnalyticsListener {
|
||||
|
||||
private BehaviorSubject<Boolean> isBufferingSource = BehaviorSubject.create();
|
||||
|
||||
Observable<Boolean> isBuffering() {
|
||||
return isBufferingSource;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPlayerStateChanged(EventTime eventTime, boolean playWhenReady, int playbackState) {
|
||||
boolean isBuffering = playWhenReady && playbackState == Player.STATE_BUFFERING;
|
||||
isBufferingSource.onNext(isBuffering);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user