diff --git a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt
index ba1204e12..b2ba912ec 100644
--- a/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt
+++ b/app/src/main/java/org/schabi/newpipe/error/ErrorInfo.kt
@@ -2,6 +2,7 @@ package org.schabi.newpipe.error
import android.os.Parcelable
import androidx.annotation.StringRes
+import com.google.android.exoplayer2.ExoPlaybackException
import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import org.schabi.newpipe.R
@@ -108,6 +109,13 @@ class ErrorInfo(
throwable is ContentNotSupportedException -> R.string.content_not_supported
throwable is DeobfuscateException -> R.string.youtube_signature_deobfuscation_error
throwable is ExtractionException -> R.string.parsing_error
+ throwable is ExoPlaybackException -> {
+ when (throwable.type) {
+ ExoPlaybackException.TYPE_SOURCE -> R.string.player_stream_failure
+ ExoPlaybackException.TYPE_UNEXPECTED -> R.string.player_recoverable_failure
+ else -> R.string.player_unrecoverable_failure
+ }
+ }
action == UserAction.UI_ERROR -> R.string.app_ui_crash
action == UserAction.REQUESTED_COMMENTS -> R.string.error_unable_to_load_comments
action == UserAction.SUBSCRIPTION_CHANGE -> R.string.subscription_change_failed
diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java
index 2d8c1a830..ee09cb866 100644
--- a/app/src/main/java/org/schabi/newpipe/player/Player.java
+++ b/app/src/main/java/org/schabi/newpipe/player/Player.java
@@ -141,6 +141,9 @@ import org.schabi.newpipe.MainActivity;
import org.schabi.newpipe.R;
import org.schabi.newpipe.databinding.PlayerBinding;
import org.schabi.newpipe.databinding.PlayerPopupCloseOverlayBinding;
+import org.schabi.newpipe.error.ErrorInfo;
+import org.schabi.newpipe.error.ErrorUtil;
+import org.schabi.newpipe.error.UserAction;
import org.schabi.newpipe.extractor.MediaFormat;
import org.schabi.newpipe.extractor.stream.StreamInfo;
import org.schabi.newpipe.extractor.stream.StreamSegment;
@@ -165,7 +168,6 @@ import org.schabi.newpipe.player.playback.MediaSourceManager;
import org.schabi.newpipe.player.playback.PlaybackListener;
import org.schabi.newpipe.player.playback.PlayerMediaSession;
import org.schabi.newpipe.player.playback.SurfaceHolderCallback;
-import org.schabi.newpipe.player.playererror.PlayerErrorHandler;
import org.schabi.newpipe.player.playqueue.PlayQueue;
import org.schabi.newpipe.player.playqueue.PlayQueueAdapter;
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
@@ -268,8 +270,6 @@ public final class Player implements
@Nullable private MediaSourceTag currentMetadata;
@Nullable private Bitmap currentThumbnail;
- @NonNull private PlayerErrorHandler playerErrorHandler;
-
/*//////////////////////////////////////////////////////////////////////////
// Player
//////////////////////////////////////////////////////////////////////////*/
@@ -413,8 +413,6 @@ public final class Player implements
videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver());
audioResolver = new AudioPlaybackResolver(context, dataSource);
- playerErrorHandler = new PlayerErrorHandler(context);
-
windowManager = ContextCompat.getSystemService(context, WindowManager.class);
}
@@ -2518,29 +2516,30 @@ public final class Player implements
saveStreamProgressState();
+ // create error notification
+ final ErrorInfo errorInfo;
+ if (currentMetadata == null) {
+ errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM,
+ "Player error[type=" + error.type + "] occurred, currentMetadata is null");
+ } else {
+ errorInfo = new ErrorInfo(error, UserAction.PLAY_STREAM,
+ "Player error[type=" + error.type + "] occurred while playing "
+ + currentMetadata.getMetadata().getUrl(),
+ currentMetadata.getMetadata());
+ }
+ ErrorUtil.createNotification(context, errorInfo);
+
switch (error.type) {
case ExoPlaybackException.TYPE_SOURCE:
processSourceError(error.getSourceException());
- playerErrorHandler.showPlayerError(
- error,
- currentMetadata.getMetadata(),
- R.string.player_stream_failure);
break;
case ExoPlaybackException.TYPE_UNEXPECTED:
- playerErrorHandler.showPlayerError(
- error,
- currentMetadata.getMetadata(),
- R.string.player_recoverable_failure);
setRecovery();
reloadPlayQueueManager();
break;
case ExoPlaybackException.TYPE_REMOTE:
case ExoPlaybackException.TYPE_RENDERER:
default:
- playerErrorHandler.showPlayerError(
- error,
- currentMetadata.getMetadata(),
- R.string.player_unrecoverable_failure);
onPlaybackShutdown();
break;
}
diff --git a/app/src/main/java/org/schabi/newpipe/player/playererror/PlayerErrorHandler.java b/app/src/main/java/org/schabi/newpipe/player/playererror/PlayerErrorHandler.java
deleted file mode 100644
index ca9b4e7df..000000000
--- a/app/src/main/java/org/schabi/newpipe/player/playererror/PlayerErrorHandler.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.schabi.newpipe.player.playererror;
-
-import android.content.Context;
-import android.util.Log;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
-import androidx.preference.PreferenceManager;
-
-import com.google.android.exoplayer2.ExoPlaybackException;
-
-import org.schabi.newpipe.R;
-import org.schabi.newpipe.error.ErrorInfo;
-import org.schabi.newpipe.error.ErrorUtil;
-import org.schabi.newpipe.error.UserAction;
-import org.schabi.newpipe.extractor.Info;
-
-/**
- * Handles (exoplayer)errors that occur in the player.
- */
-public class PlayerErrorHandler {
- // This has to be <= 23 chars on devices running Android 7 or lower (API <= 25)
- // or it fails with an IllegalArgumentException
- // https://stackoverflow.com/a/54744028
- private static final String TAG = "PlayerErrorHandler";
-
- @Nullable
- private Toast errorToast;
-
- @NonNull
- private final Context context;
-
- public PlayerErrorHandler(@NonNull final Context context) {
- this.context = context;
- }
-
- public void showPlayerError(
- @NonNull final ExoPlaybackException exception,
- @NonNull final Info info,
- @StringRes final int textResId
- ) {
- // Hide existing toast message
- if (errorToast != null) {
- Log.d(TAG, "Trying to cancel previous player error error toast");
- errorToast.cancel();
- errorToast = null;
- }
-
- if (shouldReportError()) {
- try {
- reportError(exception, info);
- // When a report pops up we need no toast
- return;
- } catch (final Exception ex) {
- Log.w(TAG, "Unable to report error:", ex);
- // This will show the toast as fallback
- }
- }
-
- Log.d(TAG, "Showing player error toast");
- errorToast = Toast.makeText(context, textResId, Toast.LENGTH_SHORT);
- errorToast.show();
- }
-
- private void reportError(@NonNull final ExoPlaybackException exception,
- @NonNull final Info info) {
- ErrorUtil.createNotification(
- context,
- new ErrorInfo(
- exception,
- UserAction.PLAY_STREAM,
- "Player error[type=" + exception.type + "] occurred while playing: "
- + info.getUrl(),
- info
- )
- );
- }
-
- private boolean shouldReportError() {
- return PreferenceManager
- .getDefaultSharedPreferences(context)
- .getBoolean(
- context.getString(R.string.report_player_errors_key),
- false);
- }
-}
diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml
index e2b797576..b88b2d064 100644
--- a/app/src/main/res/values/settings_keys.xml
+++ b/app/src/main/res/values/settings_keys.xml
@@ -89,8 +89,6 @@
- @string/never
- report_player_errors_key
-
seekbar_preview_thumbnail_key
seekbar_preview_thumbnail_high_quality
seekbar_preview_thumbnail_low_quality
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f47322b79..3319d5fb9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -53,8 +53,6 @@
Show \"Play with Kodi\" option
Display an option to play a video via Kodi media center
Crash the player
- Report player errors
- Reports player errors in full detail instead of showing a short-lived toast message (useful for diagnosing problems)
Scale thumbnail to 1:1 aspect ratio
Scale the video thumbnail shown in the notification from 16:9 to 1:1 aspect ratio (may introduce distortions)
First action button
diff --git a/app/src/main/res/xml/debug_settings.xml b/app/src/main/res/xml/debug_settings.xml
index 5e2cc28ed..df1559c37 100644
--- a/app/src/main/res/xml/debug_settings.xml
+++ b/app/src/main/res/xml/debug_settings.xml
@@ -49,14 +49,6 @@
android:title="@string/show_image_indicators_title"
app:iconSpaceReserved="false" />
-
-