mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-23 08:30:44 +00:00
Remove PlayerErrorHandler and correctly set ErrorInfo msg
This commit is contained in:
parent
397f93b079
commit
c8e2ab4c83
@ -2,6 +2,7 @@ package org.schabi.newpipe.error
|
|||||||
|
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import androidx.annotation.StringRes
|
import androidx.annotation.StringRes
|
||||||
|
import com.google.android.exoplayer2.ExoPlaybackException
|
||||||
import kotlinx.parcelize.IgnoredOnParcel
|
import kotlinx.parcelize.IgnoredOnParcel
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
import org.schabi.newpipe.R
|
import org.schabi.newpipe.R
|
||||||
@ -108,6 +109,13 @@ class ErrorInfo(
|
|||||||
throwable is ContentNotSupportedException -> R.string.content_not_supported
|
throwable is ContentNotSupportedException -> R.string.content_not_supported
|
||||||
throwable is DeobfuscateException -> R.string.youtube_signature_deobfuscation_error
|
throwable is DeobfuscateException -> R.string.youtube_signature_deobfuscation_error
|
||||||
throwable is ExtractionException -> R.string.parsing_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.UI_ERROR -> R.string.app_ui_crash
|
||||||
action == UserAction.REQUESTED_COMMENTS -> R.string.error_unable_to_load_comments
|
action == UserAction.REQUESTED_COMMENTS -> R.string.error_unable_to_load_comments
|
||||||
action == UserAction.SUBSCRIPTION_CHANGE -> R.string.subscription_change_failed
|
action == UserAction.SUBSCRIPTION_CHANGE -> R.string.subscription_change_failed
|
||||||
|
@ -141,6 +141,9 @@ import org.schabi.newpipe.MainActivity;
|
|||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.databinding.PlayerBinding;
|
import org.schabi.newpipe.databinding.PlayerBinding;
|
||||||
import org.schabi.newpipe.databinding.PlayerPopupCloseOverlayBinding;
|
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.MediaFormat;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
import org.schabi.newpipe.extractor.stream.StreamInfo;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamSegment;
|
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.PlaybackListener;
|
||||||
import org.schabi.newpipe.player.playback.PlayerMediaSession;
|
import org.schabi.newpipe.player.playback.PlayerMediaSession;
|
||||||
import org.schabi.newpipe.player.playback.SurfaceHolderCallback;
|
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.PlayQueue;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueueAdapter;
|
import org.schabi.newpipe.player.playqueue.PlayQueueAdapter;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
||||||
@ -268,8 +270,6 @@ public final class Player implements
|
|||||||
@Nullable private MediaSourceTag currentMetadata;
|
@Nullable private MediaSourceTag currentMetadata;
|
||||||
@Nullable private Bitmap currentThumbnail;
|
@Nullable private Bitmap currentThumbnail;
|
||||||
|
|
||||||
@NonNull private PlayerErrorHandler playerErrorHandler;
|
|
||||||
|
|
||||||
/*//////////////////////////////////////////////////////////////////////////
|
/*//////////////////////////////////////////////////////////////////////////
|
||||||
// Player
|
// Player
|
||||||
//////////////////////////////////////////////////////////////////////////*/
|
//////////////////////////////////////////////////////////////////////////*/
|
||||||
@ -413,8 +413,6 @@ public final class Player implements
|
|||||||
videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver());
|
videoResolver = new VideoPlaybackResolver(context, dataSource, getQualityResolver());
|
||||||
audioResolver = new AudioPlaybackResolver(context, dataSource);
|
audioResolver = new AudioPlaybackResolver(context, dataSource);
|
||||||
|
|
||||||
playerErrorHandler = new PlayerErrorHandler(context);
|
|
||||||
|
|
||||||
windowManager = ContextCompat.getSystemService(context, WindowManager.class);
|
windowManager = ContextCompat.getSystemService(context, WindowManager.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2518,29 +2516,30 @@ public final class Player implements
|
|||||||
|
|
||||||
saveStreamProgressState();
|
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) {
|
switch (error.type) {
|
||||||
case ExoPlaybackException.TYPE_SOURCE:
|
case ExoPlaybackException.TYPE_SOURCE:
|
||||||
processSourceError(error.getSourceException());
|
processSourceError(error.getSourceException());
|
||||||
playerErrorHandler.showPlayerError(
|
|
||||||
error,
|
|
||||||
currentMetadata.getMetadata(),
|
|
||||||
R.string.player_stream_failure);
|
|
||||||
break;
|
break;
|
||||||
case ExoPlaybackException.TYPE_UNEXPECTED:
|
case ExoPlaybackException.TYPE_UNEXPECTED:
|
||||||
playerErrorHandler.showPlayerError(
|
|
||||||
error,
|
|
||||||
currentMetadata.getMetadata(),
|
|
||||||
R.string.player_recoverable_failure);
|
|
||||||
setRecovery();
|
setRecovery();
|
||||||
reloadPlayQueueManager();
|
reloadPlayQueueManager();
|
||||||
break;
|
break;
|
||||||
case ExoPlaybackException.TYPE_REMOTE:
|
case ExoPlaybackException.TYPE_REMOTE:
|
||||||
case ExoPlaybackException.TYPE_RENDERER:
|
case ExoPlaybackException.TYPE_RENDERER:
|
||||||
default:
|
default:
|
||||||
playerErrorHandler.showPlayerError(
|
|
||||||
error,
|
|
||||||
currentMetadata.getMetadata(),
|
|
||||||
R.string.player_unrecoverable_failure);
|
|
||||||
onPlaybackShutdown();
|
onPlaybackShutdown();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -89,8 +89,6 @@
|
|||||||
<item>@string/never</item>
|
<item>@string/never</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<string name="report_player_errors_key" translatable="false">report_player_errors_key</string>
|
|
||||||
|
|
||||||
<string name="seekbar_preview_thumbnail_key" translatable="false">seekbar_preview_thumbnail_key</string>
|
<string name="seekbar_preview_thumbnail_key" translatable="false">seekbar_preview_thumbnail_key</string>
|
||||||
<string name="seekbar_preview_thumbnail_high_quality" translatable="false">seekbar_preview_thumbnail_high_quality</string>
|
<string name="seekbar_preview_thumbnail_high_quality" translatable="false">seekbar_preview_thumbnail_high_quality</string>
|
||||||
<string name="seekbar_preview_thumbnail_low_quality" translatable="false">seekbar_preview_thumbnail_low_quality</string>
|
<string name="seekbar_preview_thumbnail_low_quality" translatable="false">seekbar_preview_thumbnail_low_quality</string>
|
||||||
|
@ -53,8 +53,6 @@
|
|||||||
<string name="show_play_with_kodi_title">Show \"Play with Kodi\" option</string>
|
<string name="show_play_with_kodi_title">Show \"Play with Kodi\" option</string>
|
||||||
<string name="show_play_with_kodi_summary">Display an option to play a video via Kodi media center</string>
|
<string name="show_play_with_kodi_summary">Display an option to play a video via Kodi media center</string>
|
||||||
<string name="crash_the_player">Crash the player</string>
|
<string name="crash_the_player">Crash the player</string>
|
||||||
<string name="report_player_errors_title">Report player errors</string>
|
|
||||||
<string name="report_player_errors_summary">Reports player errors in full detail instead of showing a short-lived toast message (useful for diagnosing problems)</string>
|
|
||||||
<string name="notification_scale_to_square_image_title">Scale thumbnail to 1:1 aspect ratio</string>
|
<string name="notification_scale_to_square_image_title">Scale thumbnail to 1:1 aspect ratio</string>
|
||||||
<string name="notification_scale_to_square_image_summary">Scale the video thumbnail shown in the notification from 16:9 to 1:1 aspect ratio (may introduce distortions)</string>
|
<string name="notification_scale_to_square_image_summary">Scale the video thumbnail shown in the notification from 16:9 to 1:1 aspect ratio (may introduce distortions)</string>
|
||||||
<string name="notification_action_0_title">First action button</string>
|
<string name="notification_action_0_title">First action button</string>
|
||||||
|
@ -49,14 +49,6 @@
|
|||||||
android:title="@string/show_image_indicators_title"
|
android:title="@string/show_image_indicators_title"
|
||||||
app:iconSpaceReserved="false" />
|
app:iconSpaceReserved="false" />
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
|
||||||
android:defaultValue="false"
|
|
||||||
android:key="@string/report_player_errors_key"
|
|
||||||
android:summary="@string/report_player_errors_summary"
|
|
||||||
android:title="@string/report_player_errors_title"
|
|
||||||
app:singleLineTitle="false"
|
|
||||||
app:iconSpaceReserved="false" />
|
|
||||||
|
|
||||||
<Preference
|
<Preference
|
||||||
android:key="@string/crash_the_app_key"
|
android:key="@string/crash_the_app_key"
|
||||||
android:title="@string/crash_the_app"
|
android:title="@string/crash_the_app"
|
||||||
|
Loading…
Reference in New Issue
Block a user