-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add content country as additional debug information to reports
- Loading branch information
Showing
3 changed files
with
150 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,8 @@ | |
|
||
import android.app.Activity; | ||
import android.app.AlertDialog; | ||
import android.content.ClipData; | ||
import android.content.ClipboardManager; | ||
import android.content.Context; | ||
import android.content.Intent; | ||
import android.graphics.Color; | ||
|
@@ -20,6 +22,7 @@ | |
import android.widget.Button; | ||
import android.widget.EditText; | ||
import android.widget.TextView; | ||
import android.widget.Toast; | ||
|
||
import androidx.annotation.Nullable; | ||
import androidx.annotation.StringRes; | ||
|
@@ -81,6 +84,10 @@ public class ErrorActivity extends AppCompatActivity { | |
public static final String ERROR_EMAIL_ADDRESS = "[email protected]"; | ||
public static final String ERROR_EMAIL_SUBJECT | ||
= "Exception in NewPipe " + BuildConfig.VERSION_NAME; | ||
|
||
public static final String ERROR_GITHUB_ISSUE_URL | ||
= "https://github.com/TeamNewPipe/NewPipe/issues"; | ||
|
||
private String[] errorList; | ||
private ErrorInfo errorInfo; | ||
private Class returnActivity; | ||
|
@@ -200,7 +207,10 @@ protected void onCreate(final Bundle savedInstanceState) { | |
actionBar.setDisplayShowTitleEnabled(true); | ||
} | ||
|
||
Button reportButton = findViewById(R.id.errorReportButton); | ||
Button reportEmailButton = findViewById(R.id.errorReportEmailButton); | ||
Button copyButton = findViewById(R.id.errorReportCopyButton); | ||
Button reportGithubButton = findViewById(R.id.errorReportGitHubButton); | ||
|
||
userCommentBox = findViewById(R.id.errorCommentBox); | ||
TextView errorView = findViewById(R.id.errorView); | ||
TextView infoView = findViewById(R.id.errorInfosView); | ||
|
@@ -212,37 +222,28 @@ protected void onCreate(final Bundle savedInstanceState) { | |
errorList = intent.getStringArrayExtra(ERROR_LIST); | ||
|
||
// important add guru meditation | ||
addGuruMeditaion(); | ||
addGuruMeditation(); | ||
currentTimeStamp = getCurrentTimeStamp(); | ||
|
||
reportButton.setOnClickListener((View v) -> { | ||
Context context = this; | ||
new AlertDialog.Builder(context) | ||
.setIcon(android.R.drawable.ic_dialog_alert) | ||
.setTitle(R.string.privacy_policy_title) | ||
.setMessage(R.string.start_accept_privacy_policy) | ||
.setCancelable(false) | ||
.setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> { | ||
Intent webIntent = new Intent(Intent.ACTION_VIEW, | ||
Uri.parse(context.getString(R.string.privacy_policy_url)) | ||
); | ||
context.startActivity(webIntent); | ||
}) | ||
.setPositiveButton(R.string.accept, (dialog, which) -> { | ||
Intent i = new Intent(Intent.ACTION_SENDTO); | ||
i.setData(Uri.parse("mailto:" + ERROR_EMAIL_ADDRESS)) | ||
.putExtra(Intent.EXTRA_SUBJECT, ERROR_EMAIL_SUBJECT) | ||
.putExtra(Intent.EXTRA_TEXT, buildJson()); | ||
reportEmailButton.setOnClickListener((View v) -> { | ||
openPrivacyPolicyDialog(this, "EMAIL"); | ||
}); | ||
|
||
startActivity(Intent.createChooser(i, "Send Email")); | ||
}) | ||
.setNegativeButton(R.string.decline, (dialog, which) -> { | ||
// do nothing | ||
}) | ||
.show(); | ||
copyButton.setOnClickListener((View v) -> { | ||
ClipboardManager clipboard = | ||
(ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); | ||
ClipData clip = ClipData.newPlainText( | ||
"NewPipe error report", | ||
buildMarkdown()); | ||
clipboard.setPrimaryClip(clip); | ||
Toast.makeText(this, R.string.msg_copied, Toast.LENGTH_SHORT).show(); | ||
}); | ||
|
||
reportGithubButton.setOnClickListener((View v) -> { | ||
openPrivacyPolicyDialog(this, "GITHUB"); | ||
}); | ||
|
||
|
||
// normal bugreport | ||
buildInfo(errorInfo); | ||
if (errorInfo.message != 0) { | ||
|
@@ -285,6 +286,38 @@ public boolean onOptionsItemSelected(final MenuItem item) { | |
return false; | ||
} | ||
|
||
private void openPrivacyPolicyDialog(final Context context, final String action) { | ||
new AlertDialog.Builder(context) | ||
.setIcon(android.R.drawable.ic_dialog_alert) | ||
.setTitle(R.string.privacy_policy_title) | ||
.setMessage(R.string.start_accept_privacy_policy) | ||
.setCancelable(false) | ||
.setNeutralButton(R.string.read_privacy_policy, (dialog, which) -> { | ||
Intent webIntent = new Intent(Intent.ACTION_VIEW, | ||
Uri.parse(context.getString(R.string.privacy_policy_url)) | ||
); | ||
context.startActivity(webIntent); | ||
}) | ||
.setPositiveButton(R.string.accept, (dialog, which) -> { | ||
if (action.equals("EMAIL")) { // send on email | ||
Intent i = new Intent(Intent.ACTION_SENDTO); | ||
i.setData(Uri.parse("mailto:" + ERROR_EMAIL_ADDRESS)) | ||
.putExtra(Intent.EXTRA_SUBJECT, ERROR_EMAIL_SUBJECT) | ||
.putExtra(Intent.EXTRA_TEXT, buildJson()); | ||
startActivity(Intent.createChooser(i, "Send Email")); | ||
} else if (action.equals("GITHUB")) { // open the NewPipe issue page on GitHub | ||
Intent i = new Intent(Intent.ACTION_VIEW); | ||
i.setData(Uri.parse(ERROR_GITHUB_ISSUE_URL)); | ||
startActivity(Intent.createChooser(i, "Report issue on GitHub")); | ||
} | ||
|
||
}) | ||
.setNegativeButton(R.string.decline, (dialog, which) -> { | ||
// do nothing | ||
}) | ||
.show(); | ||
} | ||
|
||
private String formErrorText(final String[] el) { | ||
StringBuilder text = new StringBuilder(); | ||
if (el != null) { | ||
|
@@ -335,7 +368,8 @@ private void buildInfo(final ErrorInfo info) { | |
|
||
text += getUserActionString(info.userAction) + "\n" | ||
+ info.request + "\n" | ||
+ getContentLangString() + "\n" | ||
+ getContentLanguageString() + "\n" | ||
+ getContentCountryString() + "\n" | ||
+ info.serviceName + "\n" | ||
+ currentTimeStamp + "\n" | ||
+ getPackageName() + "\n" | ||
|
@@ -351,7 +385,8 @@ private String buildJson() { | |
.object() | ||
.value("user_action", getUserActionString(errorInfo.userAction)) | ||
.value("request", errorInfo.request) | ||
.value("content_language", getContentLangString()) | ||
.value("content_language", getContentLanguageString()) | ||
.value("content_country", getContentLanguageString()) | ||
.value("service", errorInfo.serviceName) | ||
.value("package", getPackageName()) | ||
.value("version", BuildConfig.VERSION_NAME) | ||
|
@@ -369,6 +404,55 @@ private String buildJson() { | |
return ""; | ||
} | ||
|
||
private String buildMarkdown() { | ||
StringBuilder htmlErrorReport = new StringBuilder(); | ||
|
||
final String userComment = userCommentBox.getText().toString(); | ||
if (!userComment.isEmpty()) { | ||
htmlErrorReport.append(userComment).append("\n"); | ||
} | ||
|
||
// basic error info | ||
htmlErrorReport | ||
.append("## Exception") | ||
.append("\n* __User Action:__ ").append(getUserActionString(errorInfo.userAction)) | ||
.append("\n* __Request:__ ").append(errorInfo.request) | ||
.append("\n* __Content Country:__ ").append(getContentCountryString()) | ||
.append("\n* __Content Language:__ ").append(getContentLanguageString()) | ||
.append("\n* __Service:__ ").append(errorInfo.serviceName) | ||
.append("\n* __Version:__ ").append(BuildConfig.VERSION_NAME) | ||
.append("\n* __OS:__ ").append(getOsString()).append("\n"); | ||
|
||
|
||
// Collapse all logs to a single paragraph when there are more than one | ||
// to keep the GitHub issue clean. | ||
if (errorList.length > 1) { | ||
htmlErrorReport | ||
.append("<details><summary><b>Exceptions (") | ||
.append(errorList.length) | ||
.append(")</b></summary><p>\n"); | ||
} | ||
|
||
// add the logs | ||
for (int i = 0; i < errorList.length; i++) { | ||
htmlErrorReport.append("<details><summary><b>Crash log "); | ||
if (errorList.length > 1) { | ||
htmlErrorReport.append(i + 1); | ||
} | ||
htmlErrorReport.append("</b>") | ||
.append("</summary><p>\n") | ||
.append("\n```\n").append(errorList[i]).append("\n```\n") | ||
.append("</details>\n"); | ||
} | ||
|
||
// make sure to close everything | ||
if (errorList.length > 1) { | ||
htmlErrorReport.append("</p></details>\n"); | ||
} | ||
htmlErrorReport.append("<hr>\n"); | ||
return htmlErrorReport.toString(); | ||
} | ||
|
||
private String getUserActionString(final UserAction userAction) { | ||
if (userAction == null) { | ||
return "Your description is in another castle."; | ||
|
@@ -377,9 +461,18 @@ private String getUserActionString(final UserAction userAction) { | |
} | ||
} | ||
|
||
private String getContentLangString() { | ||
String contentLanguage = PreferenceManager.getDefaultSharedPreferences(this) | ||
private String getContentCountryString() { | ||
String contentCountry = PreferenceManager.getDefaultSharedPreferences(this) | ||
.getString(this.getString(R.string.content_country_key), "none"); | ||
if (contentCountry.equals(getString(R.string.default_localization_key))) { | ||
contentCountry = Locale.getDefault().toString(); | ||
} | ||
return contentCountry; | ||
} | ||
|
||
private String getContentLanguageString() { | ||
String contentLanguage = PreferenceManager.getDefaultSharedPreferences(this) | ||
.getString(this.getString(R.string.content_language_key), "none"); | ||
if (contentLanguage.equals(getString(R.string.default_localization_key))) { | ||
contentLanguage = Locale.getDefault().toString(); | ||
} | ||
|
@@ -394,7 +487,7 @@ private String getOsString() { | |
+ " - " + Build.VERSION.SDK_INT; | ||
} | ||
|
||
private void addGuruMeditaion() { | ||
private void addGuruMeditation() { | ||
//just an easter egg | ||
TextView sorryView = findViewById(R.id.errorSorryView); | ||
String text = sorryView.getText().toString(); | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters