pop-up player crash fixed

pull/1874/head
Nitin Khanna 2018-11-07 22:01:39 +05:30
rodzic 45fea983b9
commit 86f82c0e61
1 zmienionych plików z 67 dodań i 39 usunięć

Wyświetl plik

@ -98,35 +98,54 @@ public abstract class BasePlayer implements
Player.EventListener, PlaybackListener, ImageLoadingListener { Player.EventListener, PlaybackListener, ImageLoadingListener {
public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release"); public static final boolean DEBUG = !BuildConfig.BUILD_TYPE.equals("release");
@NonNull public static final String TAG = "BasePlayer"; @NonNull
public static final String TAG = "BasePlayer";
@NonNull final protected Context context; @NonNull
final protected Context context;
@NonNull final protected BroadcastReceiver broadcastReceiver; @NonNull
@NonNull final protected IntentFilter intentFilter; final protected BroadcastReceiver broadcastReceiver;
@NonNull
final protected IntentFilter intentFilter;
@NonNull final protected HistoryRecordManager recordManager; @NonNull
final protected HistoryRecordManager recordManager;
@NonNull final protected CustomTrackSelector trackSelector; @NonNull
@NonNull final protected PlayerDataSource dataSource; final protected CustomTrackSelector trackSelector;
@NonNull
final protected PlayerDataSource dataSource;
@NonNull final private LoadControl loadControl; @NonNull
@NonNull final private RenderersFactory renderFactory; final private LoadControl loadControl;
@NonNull
final private RenderersFactory renderFactory;
@NonNull final private SerialDisposable progressUpdateReactor; @NonNull
@NonNull final private CompositeDisposable databaseUpdateReactor; final private SerialDisposable progressUpdateReactor;
@NonNull
final private CompositeDisposable databaseUpdateReactor;
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
// Intent // Intent
//////////////////////////////////////////////////////////////////////////*/ //////////////////////////////////////////////////////////////////////////*/
@NonNull public static final String REPEAT_MODE = "repeat_mode"; @NonNull
@NonNull public static final String PLAYBACK_PITCH = "playback_pitch"; public static final String REPEAT_MODE = "repeat_mode";
@NonNull public static final String PLAYBACK_SPEED = "playback_speed"; @NonNull
@NonNull public static final String PLAYBACK_SKIP_SILENCE = "playback_skip_silence"; public static final String PLAYBACK_PITCH = "playback_pitch";
@NonNull public static final String PLAYBACK_QUALITY = "playback_quality"; @NonNull
@NonNull public static final String PLAY_QUEUE_KEY = "play_queue_key"; public static final String PLAYBACK_SPEED = "playback_speed";
@NonNull public static final String APPEND_ONLY = "append_only"; @NonNull
@NonNull public static final String SELECT_ON_APPEND = "select_on_append"; public static final String PLAYBACK_SKIP_SILENCE = "playback_skip_silence";
@NonNull
public static final String PLAYBACK_QUALITY = "playback_quality";
@NonNull
public static final String PLAY_QUEUE_KEY = "play_queue_key";
@NonNull
public static final String APPEND_ONLY = "append_only";
@NonNull
public static final String SELECT_ON_APPEND = "select_on_append";
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
// Playback // Playback
@ -137,13 +156,18 @@ public abstract class BasePlayer implements
protected PlayQueue playQueue; protected PlayQueue playQueue;
protected PlayQueueAdapter playQueueAdapter; protected PlayQueueAdapter playQueueAdapter;
@Nullable protected MediaSourceManager playbackManager; @Nullable
protected MediaSourceManager playbackManager;
@Nullable private PlayQueueItem currentItem; @Nullable
@Nullable private MediaSourceTag currentMetadata; private PlayQueueItem currentItem;
@Nullable private Bitmap currentThumbnail; @Nullable
private MediaSourceTag currentMetadata;
@Nullable
private Bitmap currentThumbnail;
@Nullable protected Toast errorToast; @Nullable
protected Toast errorToast;
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
// Player // Player
@ -213,7 +237,8 @@ public abstract class BasePlayer implements
registerBroadcastReceiver(); registerBroadcastReceiver();
} }
public void initListeners() {} public void initListeners() {
}
public void handleIntent(Intent intent) { public void handleIntent(Intent intent) {
if (DEBUG) Log.d(TAG, "handleIntent() called with: intent = [" + intent + "]"); if (DEBUG) Log.d(TAG, "handleIntent() called with: intent = [" + intent + "]");
@ -297,7 +322,6 @@ public abstract class BasePlayer implements
databaseUpdateReactor.clear(); databaseUpdateReactor.clear();
progressUpdateReactor.set(null); progressUpdateReactor.set(null);
simpleExoPlayer = null;
} }
/*////////////////////////////////////////////////////////////////////////// /*//////////////////////////////////////////////////////////////////////////
@ -425,13 +449,15 @@ public abstract class BasePlayer implements
if (!isProgressLoopRunning()) startProgressLoop(); if (!isProgressLoopRunning()) startProgressLoop();
} }
public void onBuffering() {} public void onBuffering() {
}
public void onPaused() { public void onPaused() {
if (isProgressLoopRunning()) stopProgressLoop(); if (isProgressLoopRunning()) stopProgressLoop();
} }
public void onPausedSeek() {} public void onPausedSeek() {
}
public void onCompleted() { public void onCompleted() {
if (DEBUG) Log.d(TAG, "onCompleted() called"); if (DEBUG) Log.d(TAG, "onCompleted() called");
@ -602,19 +628,19 @@ public abstract class BasePlayer implements
/** /**
* Processes the exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}. * Processes the exceptions produced by {@link com.google.android.exoplayer2.ExoPlayer ExoPlayer}.
* There are multiple types of errors: <br><br> * There are multiple types of errors: <br><br>
* * <p>
* {@link ExoPlaybackException#TYPE_SOURCE TYPE_SOURCE}: <br><br> * {@link ExoPlaybackException#TYPE_SOURCE TYPE_SOURCE}: <br><br>
* * <p>
* {@link ExoPlaybackException#TYPE_UNEXPECTED TYPE_UNEXPECTED}: <br><br> * {@link ExoPlaybackException#TYPE_UNEXPECTED TYPE_UNEXPECTED}: <br><br>
* If a runtime error occurred, then we can try to recover it by restarting the playback * If a runtime error occurred, then we can try to recover it by restarting the playback
* after setting the timestamp recovery. <br><br> * after setting the timestamp recovery. <br><br>
* * <p>
* {@link ExoPlaybackException#TYPE_RENDERER TYPE_RENDERER}: <br><br> * {@link ExoPlaybackException#TYPE_RENDERER TYPE_RENDERER}: <br><br>
* If the renderer failed, treat the error as unrecoverable. * If the renderer failed, treat the error as unrecoverable.
* *
* @see #processSourceError(IOException) * @see #processSourceError(IOException)
* @see Player.EventListener#onPlayerError(ExoPlaybackException) * @see Player.EventListener#onPlayerError(ExoPlaybackException)
* */ */
@Override @Override
public void onPlayerError(ExoPlaybackException error) { public void onPlayerError(ExoPlaybackException error) {
if (DEBUG) Log.d(TAG, "ExoPlayer - onPlayerError() called with: " + if (DEBUG) Log.d(TAG, "ExoPlayer - onPlayerError() called with: " +
@ -900,8 +926,8 @@ public abstract class BasePlayer implements
if (DEBUG) Log.d(TAG, "onPlayPrevious() called"); if (DEBUG) Log.d(TAG, "onPlayPrevious() called");
/* If current playback has run for PLAY_PREV_ACTIVATION_LIMIT_MILLIS milliseconds, /* If current playback has run for PLAY_PREV_ACTIVATION_LIMIT_MILLIS milliseconds,
* restart current track. Also restart the track if the current track * restart current track. Also restart the track if the current track
* is the first in a queue.*/ * is the first in a queue.*/
if (simpleExoPlayer.getCurrentPosition() > PLAY_PREV_ACTIVATION_LIMIT_MILLIS || if (simpleExoPlayer.getCurrentPosition() > PLAY_PREV_ACTIVATION_LIMIT_MILLIS ||
playQueue.getIndex() == 0) { playQueue.getIndex() == 0) {
seekToDefault(); seekToDefault();
@ -1010,8 +1036,8 @@ public abstract class BasePlayer implements
try { try {
metadata = (MediaSourceTag) simpleExoPlayer.getCurrentTag(); metadata = (MediaSourceTag) simpleExoPlayer.getCurrentTag();
} catch (IndexOutOfBoundsException | ClassCastException error) { } catch (IndexOutOfBoundsException | ClassCastException error) {
if(DEBUG) Log.d(TAG, "Could not update metadata: " + error.getMessage()); if (DEBUG) Log.d(TAG, "Could not update metadata: " + error.getMessage());
if(DEBUG) error.printStackTrace(); if (DEBUG) error.printStackTrace();
return; return;
} }
@ -1075,7 +1101,9 @@ public abstract class BasePlayer implements
currentThumbnail; currentThumbnail;
} }
/** Checks if the current playback is a livestream AND is playing at or beyond the live edge */ /**
* Checks if the current playback is a livestream AND is playing at or beyond the live edge
*/
@SuppressWarnings("BooleanMethodIsAlwaysInverted") @SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean isLiveEdge() { public boolean isLiveEdge() {
if (simpleExoPlayer == null || !isLive()) return false; if (simpleExoPlayer == null || !isLive()) return false;
@ -1099,8 +1127,8 @@ public abstract class BasePlayer implements
} catch (@NonNull IndexOutOfBoundsException ignored) { } catch (@NonNull IndexOutOfBoundsException ignored) {
// Why would this even happen =( // Why would this even happen =(
// But lets log it anyway. Save is save // But lets log it anyway. Save is save
if(DEBUG) Log.d(TAG, "Could not update metadata: " + ignored.getMessage()); if (DEBUG) Log.d(TAG, "Could not update metadata: " + ignored.getMessage());
if(DEBUG) ignored.printStackTrace(); if (DEBUG) ignored.printStackTrace();
return false; return false;
} }
} }