mirror of
https://github.com/TeamNewPipe/NewPipe
synced 2024-12-23 08:30:44 +00:00
Create ErrorUtil class with three ways to report errors
Activity, snackbar and notification
This commit is contained in:
parent
7dc85af5fb
commit
1d2642f1e3
@ -227,28 +227,35 @@ public class App extends MultiDexApplication {
|
|||||||
// the main and update channels
|
// the main and update channels
|
||||||
final NotificationChannelCompat mainChannel = new NotificationChannelCompat
|
final NotificationChannelCompat mainChannel = new NotificationChannelCompat
|
||||||
.Builder(getString(R.string.notification_channel_id),
|
.Builder(getString(R.string.notification_channel_id),
|
||||||
NotificationManagerCompat.IMPORTANCE_LOW)
|
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||||
.setName(getString(R.string.notification_channel_name))
|
.setName(getString(R.string.notification_channel_name))
|
||||||
.setDescription(getString(R.string.notification_channel_description))
|
.setDescription(getString(R.string.notification_channel_description))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final NotificationChannelCompat appUpdateChannel = new NotificationChannelCompat
|
final NotificationChannelCompat appUpdateChannel = new NotificationChannelCompat
|
||||||
.Builder(getString(R.string.app_update_notification_channel_id),
|
.Builder(getString(R.string.app_update_notification_channel_id),
|
||||||
NotificationManagerCompat.IMPORTANCE_LOW)
|
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||||
.setName(getString(R.string.app_update_notification_channel_name))
|
.setName(getString(R.string.app_update_notification_channel_name))
|
||||||
.setDescription(getString(R.string.app_update_notification_channel_description))
|
.setDescription(getString(R.string.app_update_notification_channel_description))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
final NotificationChannelCompat hashChannel = new NotificationChannelCompat
|
final NotificationChannelCompat hashChannel = new NotificationChannelCompat
|
||||||
.Builder(getString(R.string.hash_channel_id),
|
.Builder(getString(R.string.hash_channel_id),
|
||||||
NotificationManagerCompat.IMPORTANCE_HIGH)
|
NotificationManagerCompat.IMPORTANCE_HIGH)
|
||||||
.setName(getString(R.string.hash_channel_name))
|
.setName(getString(R.string.hash_channel_name))
|
||||||
.setDescription(getString(R.string.hash_channel_description))
|
.setDescription(getString(R.string.hash_channel_description))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
final NotificationChannelCompat errorReportChannel = new NotificationChannelCompat
|
||||||
|
.Builder(getString(R.string.error_report_channel_id),
|
||||||
|
NotificationManagerCompat.IMPORTANCE_LOW)
|
||||||
|
.setName(getString(R.string.error_report_channel_name))
|
||||||
|
.setDescription(getString(R.string.error_report_channel_description))
|
||||||
|
.build();
|
||||||
|
|
||||||
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
|
final NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
|
||||||
notificationManager.createNotificationChannelsCompat(Arrays.asList(mainChannel,
|
notificationManager.createNotificationChannelsCompat(Arrays.asList(mainChannel,
|
||||||
appUpdateChannel, hashChannel));
|
appUpdateChannel, hashChannel, errorReportChannel));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean isDisposedRxExceptionsReported() {
|
protected boolean isDisposedRxExceptionsReported() {
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package org.schabi.newpipe.error;
|
package org.schabi.newpipe.error;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.graphics.Color;
|
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@ -11,15 +12,12 @@ import android.util.Log;
|
|||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuInflater;
|
import android.view.MenuInflater;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.ActionBar;
|
import androidx.appcompat.app.ActionBar;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.fragment.app.Fragment;
|
|
||||||
|
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
|
||||||
import com.grack.nanojson.JsonWriter;
|
import com.grack.nanojson.JsonWriter;
|
||||||
|
|
||||||
import org.schabi.newpipe.BuildConfig;
|
import org.schabi.newpipe.BuildConfig;
|
||||||
@ -27,15 +25,13 @@ import org.schabi.newpipe.MainActivity;
|
|||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.databinding.ActivityErrorBinding;
|
import org.schabi.newpipe.databinding.ActivityErrorBinding;
|
||||||
import org.schabi.newpipe.util.Localization;
|
import org.schabi.newpipe.util.Localization;
|
||||||
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
|
||||||
import org.schabi.newpipe.util.ThemeHelper;
|
import org.schabi.newpipe.util.ThemeHelper;
|
||||||
|
import org.schabi.newpipe.util.external_communication.ShareUtils;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Created by Christian Schabesberger on 24.10.15.
|
* Created by Christian Schabesberger on 24.10.15.
|
||||||
*
|
*
|
||||||
@ -56,7 +52,7 @@ import static org.schabi.newpipe.util.Localization.assureCorrectAppLanguage;
|
|||||||
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
* along with NewPipe. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ErrorActivity extends AppCompatActivity {
|
class ErrorActivity extends AppCompatActivity {
|
||||||
// LOG TAGS
|
// LOG TAGS
|
||||||
public static final String TAG = ErrorActivity.class.toString();
|
public static final String TAG = ErrorActivity.class.toString();
|
||||||
// BUNDLE TAGS
|
// BUNDLE TAGS
|
||||||
@ -77,67 +73,6 @@ public class ErrorActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
private ActivityErrorBinding activityErrorBinding;
|
private ActivityErrorBinding activityErrorBinding;
|
||||||
|
|
||||||
/**
|
|
||||||
* Reports a new error by starting a new activity.
|
|
||||||
* <br/>
|
|
||||||
* Ensure that the data within errorInfo is serializable otherwise
|
|
||||||
* an exception will be thrown!<br/>
|
|
||||||
* {@link EnsureExceptionSerializable} might help.
|
|
||||||
*
|
|
||||||
* @param context
|
|
||||||
* @param errorInfo
|
|
||||||
*/
|
|
||||||
public static void reportError(final Context context, final ErrorInfo errorInfo) {
|
|
||||||
final Intent intent = new Intent(context, ErrorActivity.class);
|
|
||||||
intent.putExtra(ERROR_INFO, errorInfo);
|
|
||||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
context.startActivity(intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void reportErrorInSnackbar(final Context context, final ErrorInfo errorInfo) {
|
|
||||||
final View rootView = context instanceof Activity
|
|
||||||
? ((Activity) context).findViewById(android.R.id.content) : null;
|
|
||||||
reportErrorInSnackbar(context, rootView, errorInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void reportErrorInSnackbar(final Fragment fragment, final ErrorInfo errorInfo) {
|
|
||||||
View rootView = fragment.getView();
|
|
||||||
if (rootView == null && fragment.getActivity() != null) {
|
|
||||||
rootView = fragment.getActivity().findViewById(android.R.id.content);
|
|
||||||
}
|
|
||||||
reportErrorInSnackbar(fragment.requireContext(), rootView, errorInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void reportUiErrorInSnackbar(final Context context,
|
|
||||||
final String request,
|
|
||||||
final Throwable throwable) {
|
|
||||||
reportErrorInSnackbar(context, new ErrorInfo(throwable, UserAction.UI_ERROR, request));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void reportUiErrorInSnackbar(final Fragment fragment,
|
|
||||||
final String request,
|
|
||||||
final Throwable throwable) {
|
|
||||||
reportErrorInSnackbar(fragment, new ErrorInfo(throwable, UserAction.UI_ERROR, request));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// Utils
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
private static void reportErrorInSnackbar(final Context context,
|
|
||||||
@Nullable final View rootView,
|
|
||||||
final ErrorInfo errorInfo) {
|
|
||||||
if (rootView != null) {
|
|
||||||
Snackbar.make(rootView, R.string.error_snackbar_message, Snackbar.LENGTH_LONG)
|
|
||||||
.setActionTextColor(Color.YELLOW)
|
|
||||||
.setAction(context.getString(R.string.error_snackbar_action).toUpperCase(), v ->
|
|
||||||
reportError(context, errorInfo)).show();
|
|
||||||
} else {
|
|
||||||
reportError(context, errorInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// Activity lifecycle
|
// Activity lifecycle
|
||||||
|
96
app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt
Normal file
96
app/src/main/java/org/schabi/newpipe/error/ErrorUtil.kt
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package org.schabi.newpipe.error
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.view.View
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import com.google.android.material.snackbar.Snackbar
|
||||||
|
import org.schabi.newpipe.R
|
||||||
|
|
||||||
|
class ErrorUtil {
|
||||||
|
companion object {
|
||||||
|
private const val ERROR_REPORT_NOTIFICATION_ID = 5340681;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reports a new error by starting a new activity.
|
||||||
|
* <br></br>
|
||||||
|
* Ensure that the data within errorInfo is serializable otherwise
|
||||||
|
* an exception will be thrown!<br></br>
|
||||||
|
* [EnsureExceptionSerializable] might help.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* @param errorInfo
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun openActivity(context: Context, errorInfo: ErrorInfo) {
|
||||||
|
val intent = Intent(context, ErrorActivity::class.java)
|
||||||
|
intent.putExtra(ErrorActivity.ERROR_INFO, errorInfo)
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
context.startActivity(intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun showSnackbar(context: Context, errorInfo: ErrorInfo) {
|
||||||
|
val rootView = if (context is Activity) context.findViewById<View>(R.id.content) else null
|
||||||
|
showSnackbar(context, rootView, errorInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun showSnackbar(fragment: Fragment, errorInfo: ErrorInfo) {
|
||||||
|
var rootView = fragment.view
|
||||||
|
if (rootView == null && fragment.activity != null) {
|
||||||
|
rootView = fragment.requireActivity().findViewById(R.id.content)
|
||||||
|
}
|
||||||
|
showSnackbar(fragment.requireContext(), rootView, errorInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun showUiErrorSnackbar(context: Context, request: String, throwable: Throwable) {
|
||||||
|
showSnackbar(context, ErrorInfo(throwable, UserAction.UI_ERROR, request))
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun showUiErrorSnackbar(fragment: Fragment, request: String, throwable: Throwable) {
|
||||||
|
showSnackbar(fragment, ErrorInfo(throwable, UserAction.UI_ERROR, request))
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun createNotification(context: Context, errorInfo: ErrorInfo) {
|
||||||
|
val notificationManager =
|
||||||
|
ContextCompat.getSystemService(context, NotificationManager::class.java)
|
||||||
|
if (notificationManager == null) {
|
||||||
|
// this should never happen, but just in case open error activity
|
||||||
|
openActivity(context, errorInfo)
|
||||||
|
}
|
||||||
|
|
||||||
|
val notificationBuilder: NotificationCompat.Builder =
|
||||||
|
NotificationCompat.Builder(context,
|
||||||
|
context.getString(R.string.error_report_channel_id))
|
||||||
|
.setSmallIcon(R.drawable.ic_bug_report)
|
||||||
|
.setContentTitle(context.getString(R.string.error_report_title))
|
||||||
|
.setContentText(context.getString(errorInfo.messageStringId))
|
||||||
|
|
||||||
|
notificationManager!!.notify(ERROR_REPORT_NOTIFICATION_ID, notificationBuilder.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private fun showSnackbar(context: Context, rootView: View?, errorInfo: ErrorInfo) {
|
||||||
|
if (rootView == null) {
|
||||||
|
// fallback to showing a notification if no root view is available
|
||||||
|
createNotification(context, errorInfo)
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Snackbar.make(rootView, R.string.error_snackbar_message, Snackbar.LENGTH_LONG)
|
||||||
|
.setActionTextColor(Color.YELLOW)
|
||||||
|
.setAction(context.getString(R.string.error_snackbar_action).uppercase()) {
|
||||||
|
openActivity(context, errorInfo)
|
||||||
|
}.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -182,14 +182,17 @@
|
|||||||
<string name="just_once">Just Once</string>
|
<string name="just_once">Just Once</string>
|
||||||
<string name="file">File</string>
|
<string name="file">File</string>
|
||||||
<string name="notification_channel_id" translatable="false">newpipe</string>
|
<string name="notification_channel_id" translatable="false">newpipe</string>
|
||||||
<string name="notification_channel_name">NewPipe Notification</string>
|
<string name="notification_channel_name">NewPipe notification</string>
|
||||||
<string name="notification_channel_description">Notifications for NewPipe background and popup players</string>
|
<string name="notification_channel_description">Notifications for NewPipe\'s player</string>
|
||||||
<string name="app_update_notification_channel_id" translatable="false">newpipeAppUpdate</string>
|
<string name="app_update_notification_channel_id" translatable="false">newpipeAppUpdate</string>
|
||||||
<string name="app_update_notification_channel_name">App Update Notification</string>
|
<string name="app_update_notification_channel_name">App update notification</string>
|
||||||
<string name="app_update_notification_channel_description">Notifications for new NewPipe version</string>
|
<string name="app_update_notification_channel_description">Notifications for new NewPipe versions</string>
|
||||||
<string name="hash_channel_id" translatable="false">newpipeHash</string>
|
<string name="hash_channel_id" translatable="false">newpipeHash</string>
|
||||||
<string name="hash_channel_name">Video Hash Notification</string>
|
<string name="hash_channel_name">Video hash notification</string>
|
||||||
<string name="hash_channel_description">Notifications for video hashing progress</string>
|
<string name="hash_channel_description">Notifications for video hashing progress</string>
|
||||||
|
<string name="error_report_channel_id" translatable="false">newpipeErrorReport</string>
|
||||||
|
<string name="error_report_channel_name">Error report notification</string>
|
||||||
|
<string name="error_report_channel_description">Notifications to report errors</string>
|
||||||
<string name="unknown_content">[Unknown]</string>
|
<string name="unknown_content">[Unknown]</string>
|
||||||
<string name="switch_to_background">Switch to Background</string>
|
<string name="switch_to_background">Switch to Background</string>
|
||||||
<string name="switch_to_popup">Switch to Popup</string>
|
<string name="switch_to_popup">Switch to Popup</string>
|
||||||
|
Loading…
Reference in New Issue
Block a user