Merge pull request #4940 from ByteHamster/more-reliable-chapters

More reliable chapter loading
This commit is contained in:
ByteHamster 2021-02-16 09:39:23 +01:00 committed by GitHub
commit 0f692be2d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 47 additions and 98 deletions

View File

@ -108,7 +108,12 @@ public class PlaybackTest {
}
private void setupPlaybackController() {
controller = new PlaybackController(activityTestRule.getActivity());
controller = new PlaybackController(activityTestRule.getActivity()) {
@Override
public void loadMediaInfo() {
// Do nothing
}
};
controller.init();
}

View File

@ -73,7 +73,12 @@ public class SpeedChangeTest {
EspressoTestUtils.tryKillPlaybackService();
activityRule.launchActivity(new Intent().putExtra(MainActivityStarter.EXTRA_OPEN_PLAYER, true));
controller = new PlaybackController(activityRule.getActivity());
controller = new PlaybackController(activityRule.getActivity()) {
@Override
public void loadMediaInfo() {
// Do nothing
}
};
controller.init();
controller.getMedia(); // To load media
}

View File

@ -88,12 +88,6 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
private PlaybackController newPlaybackController() {
return new PlaybackController(this) {
@Override
public void setupGUI() {
MediaplayerActivity.this.setupGUI();
}
@Override
public void onPositionObserverUpdate() {
MediaplayerActivity.this.onPositionObserverUpdate();
@ -135,8 +129,8 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
}
@Override
public boolean loadMediaInfo() {
return MediaplayerActivity.this.loadMediaInfo();
public void loadMediaInfo() {
MediaplayerActivity.this.loadMediaInfo();
}
@Override
@ -459,16 +453,15 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements
* to the PlaybackService to ensure that the activity has the right
* FeedMedia object.
*/
boolean loadMediaInfo() {
void loadMediaInfo() {
Log.d(TAG, "loadMediaInfo()");
if(controller == null || controller.getMedia() == null) {
return false;
if (controller == null || controller.getMedia() == null) {
return;
}
showTimeLeft = UserPreferences.shouldShowRemainingTime();
onPositionObserverUpdate();
checkFavorite();
updatePlaybackSpeedButton();
return true;
}
void updatePlaybackSpeedButton() {

View File

@ -132,17 +132,13 @@ public class VideoplayerActivity extends MediaplayerActivity {
}
@Override
protected boolean loadMediaInfo() {
if (!super.loadMediaInfo() || controller == null) {
return false;
}
protected void loadMediaInfo() {
super.loadMediaInfo();
Playable media = controller.getMedia();
if (media != null) {
getSupportActionBar().setSubtitle(media.getEpisodeTitle());
getSupportActionBar().setTitle(media.getFeedTitle());
return true;
}
return false;
}
@Override

View File

@ -42,7 +42,7 @@ public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapte
hasImages = false;
if (media.getChapters() != null) {
for (Chapter chapter : media.getChapters()) {
if (!ignoreChapter(chapter) && !TextUtils.isEmpty(chapter.getImageUrl())) {
if (!TextUtils.isEmpty(chapter.getImageUrl())) {
hasImages = true;
}
}
@ -125,14 +125,7 @@ public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapte
if (media == null || media.getChapters() == null) {
return 0;
}
// ignore invalid chapters
int counter = 0;
for (Chapter chapter : media.getChapters()) {
if (!ignoreChapter(chapter)) {
counter++;
}
}
return counter;
return media.getChapters().size();
}
static class ChapterHolder extends RecyclerView.ViewHolder {
@ -171,22 +164,8 @@ public class ChaptersListAdapter extends RecyclerView.Adapter<ChaptersListAdapte
notifyItemChanged(currentChapterIndex, "foo");
}
private boolean ignoreChapter(Chapter c) {
return media.getDuration() > 0 && media.getDuration() < c.getStart();
}
public Chapter getItem(int position) {
int i = 0;
for (Chapter chapter : media.getChapters()) {
if (!ignoreChapter(chapter)) {
if (i == position) {
return chapter;
} else {
i++;
}
}
}
return null;
return media.getChapters().get(position);
}
public interface Callback {

View File

@ -41,7 +41,7 @@ public class PlaybackControlsDialog extends DialogFragment {
super.onStart();
controller = new PlaybackController(getActivity()) {
@Override
public void setupGUI() {
public void loadMediaInfo() {
setupUi();
setupAudioTracks();
}

View File

@ -47,12 +47,12 @@ public class SleepTimerDialog extends DialogFragment {
super.onStart();
controller = new PlaybackController(getActivity()) {
@Override
public void setupGUI() {
public void onSleepTimerUpdate() {
updateTime();
}
@Override
public void onSleepTimerUpdate() {
public void loadMediaInfo() {
updateTime();
}
};

View File

@ -56,12 +56,12 @@ public class VariableSpeedDialog extends DialogFragment {
super.onStart();
controller = new PlaybackController(getActivity()) {
@Override
public void setupGUI() {
public void onPlaybackSpeedChange() {
updateSpeed();
}
@Override
public void onPlaybackSpeedChange() {
public void loadMediaInfo() {
updateSpeed();
}
};

View File

@ -312,12 +312,6 @@ public class AudioPlayerFragment extends Fragment implements
private PlaybackController newPlaybackController() {
return new PlaybackController(getActivity()) {
@Override
public void setupGUI() {
AudioPlayerFragment.this.loadMediaInfo();
}
@Override
public void onBufferStart() {
progressIndicator.setVisibility(View.VISIBLE);
@ -365,9 +359,8 @@ public class AudioPlayerFragment extends Fragment implements
}
@Override
public boolean loadMediaInfo() {
public void loadMediaInfo() {
AudioPlayerFragment.this.loadMediaInfo();
return true;
}
@Override

View File

@ -72,13 +72,7 @@ public class ChaptersFragment extends Fragment {
super.onStart();
controller = new PlaybackController(getActivity()) {
@Override
public boolean loadMediaInfo() {
ChaptersFragment.this.loadMediaInfo();
return true;
}
@Override
public void setupGUI() {
public void loadMediaInfo() {
ChaptersFragment.this.loadMediaInfo();
}

View File

@ -117,13 +117,7 @@ public class CoverFragment extends Fragment {
super.onStart();
controller = new PlaybackController(getActivity()) {
@Override
public boolean loadMediaInfo() {
CoverFragment.this.loadMediaInfo();
return true;
}
@Override
public void setupGUI() {
public void loadMediaInfo() {
CoverFragment.this.loadMediaInfo();
}
};

View File

@ -108,12 +108,7 @@ public class ExternalPlayerFragment extends Fragment {
}
@Override
public boolean loadMediaInfo() {
return ExternalPlayerFragment.this.loadMediaInfo();
}
@Override
public void setupGUI() {
public void loadMediaInfo() {
ExternalPlayerFragment.this.loadMediaInfo();
}
@ -170,11 +165,11 @@ public class ExternalPlayerFragment extends Fragment {
}
}
private boolean loadMediaInfo() {
private void loadMediaInfo() {
Log.d(TAG, "Loading media info");
if (controller == null) {
Log.w(TAG, "loadMediaInfo was called while PlaybackController was null!");
return false;
return;
}
if (disposable != null) {
@ -186,7 +181,6 @@ public class ExternalPlayerFragment extends Fragment {
.subscribe(this::updateUi,
error -> Log.e(TAG, Log.getStackTraceString(error)),
() -> ((MainActivity) getActivity()).setPlayerVisible(false));
return true;
}
private void updateUi(Playable media) {

View File

@ -140,14 +140,8 @@ public class ItemDescriptionFragment extends Fragment {
super.onStart();
controller = new PlaybackController(getActivity()) {
@Override
public boolean loadMediaInfo() {
public void loadMediaInfo() {
load();
return true;
}
@Override
public void setupGUI() {
ItemDescriptionFragment.this.load();
}
};
controller.init();

View File

@ -238,7 +238,12 @@ public class ItemFragment extends Fragment {
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
controller = new PlaybackController(getActivity());
controller = new PlaybackController(getActivity()) {
@Override
public void loadMediaInfo() {
// Do nothing
}
};
controller.init();
}

View File

@ -51,7 +51,7 @@ import java.util.List;
* Communicates with the playback service. GUI classes should use this class to
* control playback instead of communicating with the PlaybackService directly.
*/
public class PlaybackController {
public abstract class PlaybackController {
private static final String TAG = "PlaybackController";
private static final int INVALID_TIME = -1;
@ -193,7 +193,6 @@ public class PlaybackController {
bound = activity.bindService(optionalIntent.get(), mConnection, 0);
} else {
status = PlayerStatus.STOPPED;
setupGUI();
handleStatus();
}
} else {
@ -331,8 +330,6 @@ public class PlaybackController {
}
};
public void setupGUI() {}
public void onPositionObserverUpdate() {}
@ -431,7 +428,10 @@ public class PlaybackController {
}
private void checkMediaInfoLoaded() {
mediaInfoLoaded = (mediaInfoLoaded || loadMediaInfo());
if (!mediaInfoLoaded) {
loadMediaInfo();
}
mediaInfoLoaded = true;
}
private void updatePlayButtonAppearance(int resource, CharSequence contentDescription) {
@ -446,9 +446,7 @@ public class PlaybackController {
return null;
}
public boolean loadMediaInfo() {
return false;
}
public abstract void loadMediaInfo();
public void onAwaitingVideoSurface() {}
@ -463,10 +461,9 @@ public class PlaybackController {
status = info.playerStatus;
media = info.playable;
setupGUI();
handleStatus();
// make sure that new media is loaded if it's available
mediaInfoLoaded = false;
handleStatus();
} else {
Log.e(TAG,