Implemented missing PlaybackController state handling

This commit is contained in:
ByteHamster 2020-03-25 16:09:39 +01:00
parent 982ce61b3f
commit a989db586a
8 changed files with 42 additions and 106 deletions

View File

@ -137,16 +137,6 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
return butPlay; return butPlay;
} }
@Override
public void postStatusMsg(int msg, boolean showToast) {
MediaplayerActivity.this.postStatusMsg(msg, showToast);
}
@Override
public void clearStatusMsg() {
MediaplayerActivity.this.clearStatusMsg();
}
@Override @Override
public boolean loadMediaInfo() { public boolean loadMediaInfo() {
return MediaplayerActivity.this.loadMediaInfo(); return MediaplayerActivity.this.loadMediaInfo();
@ -248,12 +238,16 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
* Should be used to inform the user that the PlaybackService is currently * Should be used to inform the user that the PlaybackService is currently
* buffering. * buffering.
*/ */
protected abstract void onBufferStart(); protected void onBufferStart() {
}
/** /**
* Should be used to hide the view that was showing the 'buffering'-message. * Should be used to hide the view that was showing the 'buffering'-message.
*/ */
protected abstract void onBufferEnd(); protected void onBufferEnd() {
}
private void onBufferUpdate(float progress) { private void onBufferUpdate(float progress) {
if (sbPosition != null) { if (sbPosition != null) {
@ -468,10 +462,6 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
*/ */
protected abstract void onAwaitingVideoSurface(); protected abstract void onAwaitingVideoSurface();
protected abstract void postStatusMsg(int resId, boolean showToast);
protected abstract void clearStatusMsg();
void onPositionObserverUpdate() { void onPositionObserverUpdate() {
if (controller == null || txtvPosition == null || txtvLength == null) { if (controller == null || txtvPosition == null || txtvLength == null) {
return; return;

View File

@ -126,24 +126,6 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity {
startActivity(new Intent(this, VideoplayerActivity.class)); startActivity(new Intent(this, VideoplayerActivity.class));
} }
@Override
protected void postStatusMsg(int resId, boolean showToast) {
if (resId == R.string.player_preparing_msg
|| resId == R.string.player_seeking_msg
|| resId == R.string.player_buffering_msg) {
// TODO Show progress bar here
}
if (showToast) {
Toast.makeText(this, resId, Toast.LENGTH_SHORT).show();
}
}
@Override
protected void clearStatusMsg() {
// TODO Hide progress bar here
}
@Override @Override
protected void setupGUI() { protected void setupGUI() {
super.setupGUI(); super.setupGUI();
@ -199,16 +181,6 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity {
} }
} }
@Override
protected void onBufferStart() {
postStatusMsg(R.string.player_buffering_msg, false);
}
@Override
protected void onBufferEnd() {
clearStatusMsg();
}
public PlaybackController getPlaybackController() { public PlaybackController getPlaybackController() {
return controller; return controller;
} }

View File

@ -171,20 +171,6 @@ public class VideoplayerActivity extends MediaplayerActivity {
} }
} }
@Override
protected void postStatusMsg(int resId, boolean showToast) {
if (resId == R.string.player_preparing_msg) {
progressIndicator.setVisibility(View.VISIBLE);
} else {
progressIndicator.setVisibility(View.INVISIBLE);
}
}
@Override
protected void clearStatusMsg() {
progressIndicator.setVisibility(View.INVISIBLE);
}
private final View.OnTouchListener onVideoviewTouched = (v, event) -> { private final View.OnTouchListener onVideoviewTouched = (v, event) -> {
if (event.getAction() == MotionEvent.ACTION_DOWN) { if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (PictureInPictureUtil.isInPictureInPictureMode(this)) { if (PictureInPictureUtil.isInPictureInPictureMode(this)) {

View File

@ -10,9 +10,11 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
@ -33,6 +35,7 @@ import de.danoeh.antennapod.core.service.playback.PlaybackService;
import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.core.util.Converter;
import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.IntentUtils;
import de.danoeh.antennapod.core.util.TimeSpeedConverter; import de.danoeh.antennapod.core.util.TimeSpeedConverter;
import de.danoeh.antennapod.core.util.playback.MediaPlayerError;
import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.Playable;
import de.danoeh.antennapod.core.util.playback.PlaybackController; import de.danoeh.antennapod.core.util.playback.PlaybackController;
import de.danoeh.antennapod.dialog.PlaybackControlsDialog; import de.danoeh.antennapod.dialog.PlaybackControlsDialog;
@ -77,6 +80,7 @@ public class AudioPlayerFragment extends Fragment implements
private TextView txtvFF; private TextView txtvFF;
private ImageButton butSkip; private ImageButton butSkip;
private Toolbar toolbar; private Toolbar toolbar;
private ProgressBar progressIndicator;
private PlaybackController controller; private PlaybackController controller;
private boolean showTimeLeft; private boolean showTimeLeft;
@ -108,6 +112,7 @@ public class AudioPlayerFragment extends Fragment implements
butFF = root.findViewById(R.id.butFF); butFF = root.findViewById(R.id.butFF);
txtvFF = root.findViewById(R.id.txtvFF); txtvFF = root.findViewById(R.id.txtvFF);
butSkip = root.findViewById(R.id.butSkip); butSkip = root.findViewById(R.id.butSkip);
progressIndicator = root.findViewById(R.id.progLoading);
setupLengthTextView(); setupLengthTextView();
setupControlButtons(); setupControlButtons();
@ -249,27 +254,32 @@ public class AudioPlayerFragment extends Fragment implements
@Override @Override
public void onBufferStart() { public void onBufferStart() {
//MediaplayerActivity.this.onBufferStart(); progressIndicator.setVisibility(View.VISIBLE);
} }
@Override @Override
public void onBufferEnd() { public void onBufferEnd() {
//MediaplayerActivity.this.onBufferEnd(); progressIndicator.setVisibility(View.GONE);
} }
@Override @Override
public void onBufferUpdate(float progress) { public void onBufferUpdate(float progress) {
//MediaplayerActivity.this.onBufferUpdate(progress); sbPosition.setSecondaryProgress((int) (progress * sbPosition.getMax()));
} }
@Override @Override
public void handleError(int code) { public void handleError(int code) {
//MediaplayerActivity.this.handleError(code); final AlertDialog.Builder errorDialog = new AlertDialog.Builder(getContext());
} errorDialog.setTitle(R.string.error_label);
errorDialog.setMessage(MediaPlayerError.getErrorString(getContext(), code));
@Override errorDialog.setNeutralButton(android.R.string.ok,
public void onReloadNotification(int code) { (dialog, which) -> {
//MediaplayerActivity.this.onReloadNotification(code); dialog.dismiss();
((MainActivity) getActivity()).getBottomSheet()
.setState(BottomSheetBehavior.STATE_COLLAPSED);
}
);
errorDialog.create().show();
} }
@Override @Override
@ -282,36 +292,21 @@ public class AudioPlayerFragment extends Fragment implements
return butPlay; return butPlay;
} }
@Override
public void postStatusMsg(int msg, boolean showToast) {
//MediaplayerActivity.this.postStatusMsg(msg, showToast);
}
@Override
public void clearStatusMsg() {
//MediaplayerActivity.this.clearStatusMsg();
}
@Override @Override
public boolean loadMediaInfo() { public boolean loadMediaInfo() {
updateUi(); updateUi();
return true; return true;
}/*
@Override
public void onServiceQueried() {
MediaplayerActivity.this.onServiceQueried();
} }
@Override @Override
public void onShutdownNotification() { public void onShutdownNotification() {
finish(); ((MainActivity) getActivity()).getBottomSheet().setState(BottomSheetBehavior.STATE_COLLAPSED);
} }
@Override @Override
public void onPlaybackEnd() { public void onPlaybackEnd() {
finish(); ((MainActivity) getActivity()).getBottomSheet().setState(BottomSheetBehavior.STATE_COLLAPSED);
}*/ }
@Override @Override
public void onPlaybackSpeedChange() { public void onPlaybackSpeedChange() {
@ -344,7 +339,6 @@ public class AudioPlayerFragment extends Fragment implements
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setRetainInstance(true); setRetainInstance(true);
//setHasOptionsMenu(true);
} }
@Override @Override

View File

@ -134,6 +134,15 @@
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/> android:layout_centerVertical="true"/>
<ProgressBar
style="?android:attr/progressBarStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:id="@+id/progLoading"
android:visibility="gone"/>
<ImageButton <ImageButton
android:id="@+id/butRev" android:id="@+id/butRev"
android:layout_width="@dimen/audioplayer_playercontrols_length" android:layout_width="@dimen/audioplayer_playercontrols_length"

View File

@ -181,11 +181,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
*/ */
public static final int NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED = 9; public static final int NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED = 9;
/**
* Send a message to the user (with provided String resource id)
*/
public static final int NOTIFICATION_TYPE_SHOW_TOAST = 10;
/** /**
* Returned by getPositionSafe() or getDurationSafe() if the playbackService * Returned by getPositionSafe() or getDurationSafe() if the playbackService
* is in an invalid state. * is in an invalid state.

View File

@ -21,6 +21,7 @@ import android.widget.ImageButton;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;
import de.danoeh.antennapod.core.event.MessageEvent;
import de.danoeh.antennapod.core.util.ThemeUtils; import de.danoeh.antennapod.core.util.ThemeUtils;
import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ScheduledThreadPoolExecutor;
@ -333,8 +334,6 @@ public class PlaybackController {
case PlaybackService.NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED: case PlaybackService.NOTIFICATION_TYPE_SET_SPEED_ABILITY_CHANGED:
onSetSpeedAbilityChanged(); onSetSpeedAbilityChanged();
break; break;
case PlaybackService.NOTIFICATION_TYPE_SHOW_TOAST:
postStatusMsg(code, true);
} }
} }
@ -411,11 +410,10 @@ public class PlaybackController {
Log.d(TAG, "status: " + status.toString()); Log.d(TAG, "status: " + status.toString());
switch (status) { switch (status) {
case ERROR: case ERROR:
postStatusMsg(R.string.player_error_msg, false); EventBus.getDefault().post(new MessageEvent(activity.getString(R.string.player_error_msg)));
handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN); handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN);
break; break;
case PAUSED: case PAUSED:
clearStatusMsg();
checkMediaInfoLoaded(); checkMediaInfoLoaded();
onPositionObserverUpdate(); onPositionObserverUpdate();
updatePlayButtonAppearance(playResource, playText); updatePlayButtonAppearance(playResource, playText);
@ -425,7 +423,6 @@ public class PlaybackController {
} }
break; break;
case PLAYING: case PLAYING:
clearStatusMsg();
checkMediaInfoLoaded(); checkMediaInfoLoaded();
if (!PlaybackService.isCasting() && if (!PlaybackService.isCasting() &&
PlaybackService.getCurrentMediaType() == MediaType.VIDEO) { PlaybackService.getCurrentMediaType() == MediaType.VIDEO) {
@ -435,7 +432,6 @@ public class PlaybackController {
updatePlayButtonAppearance(pauseResource, pauseText); updatePlayButtonAppearance(pauseResource, pauseText);
break; break;
case PREPARING: case PREPARING:
postStatusMsg(R.string.player_preparing_msg, false);
checkMediaInfoLoaded(); checkMediaInfoLoaded();
if (playbackService != null) { if (playbackService != null) {
if (playbackService.isStartWhenPrepared()) { if (playbackService.isStartWhenPrepared()) {
@ -446,21 +442,17 @@ public class PlaybackController {
} }
break; break;
case STOPPED: case STOPPED:
postStatusMsg(R.string.player_stopped_msg, false);
break; break;
case PREPARED: case PREPARED:
checkMediaInfoLoaded(); checkMediaInfoLoaded();
postStatusMsg(R.string.player_ready_msg, false);
updatePlayButtonAppearance(playResource, playText); updatePlayButtonAppearance(playResource, playText);
onPositionObserverUpdate(); onPositionObserverUpdate();
break; break;
case SEEKING: case SEEKING:
onPositionObserverUpdate(); onPositionObserverUpdate();
postStatusMsg(R.string.player_seeking_msg, false);
break; break;
case INITIALIZED: case INITIALIZED:
checkMediaInfoLoaded(); checkMediaInfoLoaded();
clearStatusMsg();
updatePlayButtonAppearance(playResource, playText); updatePlayButtonAppearance(playResource, playText);
break; break;
} }
@ -482,10 +474,6 @@ public class PlaybackController {
return null; return null;
} }
public void postStatusMsg(int msg, boolean showToast) {}
public void clearStatusMsg() {}
public boolean loadMediaInfo() { public boolean loadMediaInfo() {
return false; return false;
} }

View File

@ -26,9 +26,11 @@ import java.util.concurrent.TimeoutException;
import de.danoeh.antennapod.core.cast.CastConsumer; import de.danoeh.antennapod.core.cast.CastConsumer;
import de.danoeh.antennapod.core.cast.CastManager; import de.danoeh.antennapod.core.cast.CastManager;
import de.danoeh.antennapod.core.cast.DefaultCastConsumer; import de.danoeh.antennapod.core.cast.DefaultCastConsumer;
import de.danoeh.antennapod.core.event.MessageEvent;
import de.danoeh.antennapod.core.feed.MediaType; import de.danoeh.antennapod.core.feed.MediaType;
import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.NetworkUtils;
import org.greenrobot.eventbus.EventBus;
/** /**
* Class intended to work along PlaybackService and provide support for different flavors. * Class intended to work along PlaybackService and provide support for different flavors.
@ -106,7 +108,7 @@ public class PlaybackServiceFlavorHelper {
} }
switch (code) { switch (code) {
case RemotePSMP.CAST_ERROR: case RemotePSMP.CAST_ERROR:
callback.sendNotificationBroadcast(PlaybackService.NOTIFICATION_TYPE_SHOW_TOAST, resourceId); EventBus.getDefault().post(new MessageEvent(context.getString(resourceId)));
return true; return true;
case RemotePSMP.CAST_ERROR_PRIORITY_HIGH: case RemotePSMP.CAST_ERROR_PRIORITY_HIGH:
Toast.makeText(context, resourceId, Toast.LENGTH_SHORT).show(); Toast.makeText(context, resourceId, Toast.LENGTH_SHORT).show();