Convert CrashReporterHelper to kotlin
This commit is contained in:
parent
7d5359987a
commit
05fd58405c
@ -0,0 +1,15 @@
|
|||||||
|
package awaisomereport
|
||||||
|
|
||||||
|
import androidx.test.runner.AndroidJUnit4
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
internal class CrashReporterHelperTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getErrorContent() {
|
||||||
|
val errorContent = CrashReporterHelper.getReportContent(Exception())
|
||||||
|
print(errorContent)
|
||||||
|
}
|
||||||
|
}
|
@ -1,135 +1,129 @@
|
|||||||
package awaisomereport;
|
package awaisomereport
|
||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application
|
||||||
import android.content.Context;
|
import android.content.Context
|
||||||
import android.content.Intent;
|
import android.content.Intent
|
||||||
import android.content.res.Resources;
|
import android.os.Build
|
||||||
import android.os.Build;
|
import android.util.Log
|
||||||
import android.util.Log;
|
import awais.instagrabber.BuildConfig
|
||||||
|
import awais.instagrabber.R
|
||||||
|
import awais.instagrabber.utils.Constants
|
||||||
|
import awais.instagrabber.utils.extensions.TAG
|
||||||
|
import java.io.*
|
||||||
|
import java.time.LocalDateTime
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
object CrashReporterHelper {
|
||||||
|
private val shortBorder = "=".repeat(14)
|
||||||
|
private val longBorder = "=".repeat(21)
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
fun startErrorReporterActivity(
|
||||||
import java.io.File;
|
application: Application,
|
||||||
import java.io.FileOutputStream;
|
exception: Throwable
|
||||||
import java.io.FileReader;
|
) {
|
||||||
import java.io.PrintWriter;
|
val errorContent = getReportContent(exception)
|
||||||
import java.io.StringWriter;
|
try {
|
||||||
import java.io.Writer;
|
application.openFileOutput("stack-" + System.currentTimeMillis() + ".stacktrace", Context.MODE_PRIVATE)
|
||||||
import java.time.LocalDateTime;
|
.use { trace -> trace.write(errorContent.toByteArray()) }
|
||||||
|
} catch (ex: Exception) {
|
||||||
|
if (BuildConfig.DEBUG) Log.e(TAG, "", ex)
|
||||||
|
}
|
||||||
|
application.startActivity(Intent(application, ErrorReporterActivity::class.java).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
|
||||||
|
}
|
||||||
|
|
||||||
import awais.instagrabber.BuildConfig;
|
fun getReportContent(exception: Throwable): String {
|
||||||
import awais.instagrabber.R;
|
var reportContent =
|
||||||
import awais.instagrabber.utils.Constants;
|
"""
|
||||||
|
IMPORTANT: If sending by email, your email address and the entire content will be made public at
|
||||||
|
IMPORTANT: https://github.com/austinhuang0131/barinsta/issues
|
||||||
|
IMPORTANT: When possible, please describe the steps leading to this crash. Thank you for your cooperation.
|
||||||
|
|
||||||
public final class CrashReporterHelper {
|
Error report collected on: ${LocalDateTime.now()}
|
||||||
private static final String TAG = CrashReporterHelper.class.getSimpleName();
|
|
||||||
|
|
||||||
public static void startErrorReporterActivity(@NonNull final Application application,
|
Information:
|
||||||
@NonNull final Throwable exception) {
|
$shortBorder
|
||||||
final StringBuilder reportBuilder = new StringBuilder();
|
VERSION : ${BuildConfig.VERSION_NAME}
|
||||||
reportBuilder.append("IMPORTANT: If sending by email, your email address and the entire content will be made public at")
|
VERSION_CODE : ${BuildConfig.VERSION_CODE}
|
||||||
.append("\r\nIMPORTANT: https://github.com/austinhuang0131/barinsta/issues")
|
PHONE-MODEL : ${Build.MODEL}
|
||||||
.append("\r\nIMPORTANT: When possible, please describe the steps leading to this crash. Thank you for your cooperation.")
|
ANDROID_VERS : ${Build.VERSION.RELEASE}
|
||||||
.append("\r\n\r\nError report collected on: ").append(LocalDateTime.now().toString())
|
ANDROID_REL : ${Build.VERSION.SDK_INT}
|
||||||
.append("\r\n\r\nInformation:\r\n==============")
|
BRAND : ${Build.BRAND}
|
||||||
.append("\r\nVERSION : ").append(BuildConfig.VERSION_NAME)
|
MANUFACTURER : ${Build.MANUFACTURER}
|
||||||
.append("\r\nVERSION_CODE : ").append(BuildConfig.VERSION_CODE)
|
BOARD : ${Build.BOARD}
|
||||||
.append("\r\nPHONE-MODEL : ").append(Build.MODEL)
|
DEVICE : ${Build.DEVICE}
|
||||||
.append("\r\nANDROID_VERS : ").append(Build.VERSION.RELEASE)
|
PRODUCT : ${Build.PRODUCT}
|
||||||
.append("\r\nANDROID_REL : ").append(Build.VERSION.SDK_INT)
|
HOST : ${Build.HOST}
|
||||||
.append("\r\nBRAND : ").append(Build.BRAND)
|
TAGS : ${Build.TAGS}
|
||||||
.append("\r\nMANUFACTURER : ").append(Build.MANUFACTURER)
|
|
||||||
.append("\r\nBOARD : ").append(Build.BOARD)
|
|
||||||
.append("\r\nDEVICE : ").append(Build.DEVICE)
|
|
||||||
.append("\r\nPRODUCT : ").append(Build.PRODUCT)
|
|
||||||
.append("\r\nHOST : ").append(Build.HOST)
|
|
||||||
.append("\r\nTAGS : ").append(Build.TAGS);
|
|
||||||
|
|
||||||
reportBuilder.append("\r\n\r\nStack:\r\n==============\r\n");
|
Stack:
|
||||||
final Writer result = new StringWriter();
|
$shortBorder
|
||||||
try (final PrintWriter printWriter = new PrintWriter(result)) {
|
""".trimIndent()
|
||||||
exception.printStackTrace(printWriter);
|
reportContent = "$reportContent${getStackStrace(exception)}\n\n*** End of current Report ***"
|
||||||
reportBuilder.append(result.toString());
|
return reportContent.replace("\n", "\r\n")
|
||||||
reportBuilder.append("\r\nCause:\r\n==============");
|
}
|
||||||
// for AsyncTask crashes
|
|
||||||
Throwable cause = exception.getCause();
|
private fun getStackStrace(exception: Throwable): String {
|
||||||
|
val writer = StringWriter()
|
||||||
|
return PrintWriter(writer).use {
|
||||||
|
val reportBuilder = StringBuilder("\n")
|
||||||
|
exception.printStackTrace(it)
|
||||||
|
reportBuilder.append(writer.toString())
|
||||||
|
var cause = exception.cause
|
||||||
|
if (cause != null) reportBuilder.append("\nCause:\n$shortBorder")
|
||||||
while (cause != null) {
|
while (cause != null) {
|
||||||
cause.printStackTrace(printWriter);
|
cause.printStackTrace(it)
|
||||||
reportBuilder.append(result.toString());
|
reportBuilder.append(writer.toString())
|
||||||
cause = cause.getCause();
|
cause = cause.cause
|
||||||
}
|
}
|
||||||
|
return@use reportBuilder.toString()
|
||||||
}
|
}
|
||||||
reportBuilder.append("\r\n\r\n**** End of current Report ***");
|
|
||||||
|
|
||||||
final String errorContent = reportBuilder.toString();
|
|
||||||
try (final FileOutputStream trace = application.openFileOutput("stack-" + System.currentTimeMillis() + ".stacktrace", Context.MODE_PRIVATE)) {
|
|
||||||
trace.write(errorContent.getBytes());
|
|
||||||
} catch (final Exception ex) {
|
|
||||||
if (BuildConfig.DEBUG) Log.e(TAG, "", ex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
application.startActivity(new Intent(application, ErrorReporterActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
@JvmStatic
|
||||||
}
|
fun startCrashEmailIntent(context: Context) {
|
||||||
|
|
||||||
public static void startCrashEmailIntent(final Context context) {
|
|
||||||
try {
|
try {
|
||||||
final String filePath = context.getFilesDir().getAbsolutePath();
|
val filePath = context.filesDir.absolutePath
|
||||||
|
val errorFileList: Array<String>? = try {
|
||||||
String[] errorFileList;
|
val dir = File(filePath)
|
||||||
|
if (dir.exists() && !dir.isDirectory) {
|
||||||
try {
|
dir.delete()
|
||||||
final File dir = new File(filePath);
|
|
||||||
if (dir.exists() && !dir.isDirectory()) {
|
|
||||||
//noinspection ResultOfMethodCallIgnored
|
|
||||||
dir.delete();
|
|
||||||
}
|
}
|
||||||
//noinspection ResultOfMethodCallIgnored
|
dir.mkdirs()
|
||||||
dir.mkdirs();
|
dir.list { _: File?, name: String -> name.endsWith(".stacktrace") }
|
||||||
errorFileList = dir.list((d, name) -> name.endsWith(".stacktrace"));
|
} catch (e: Exception) {
|
||||||
} catch (final Exception e) {
|
null
|
||||||
errorFileList = null;
|
|
||||||
}
|
}
|
||||||
|
if (errorFileList == null || errorFileList.isEmpty()) {
|
||||||
if (errorFileList == null || errorFileList.length <= 0) {
|
return
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
final StringBuilder errorStringBuilder;
|
val errorStringBuilder: StringBuilder = StringBuilder("\n\n")
|
||||||
|
val maxSendMail = 5
|
||||||
errorStringBuilder = new StringBuilder("\r\n\r\n");
|
for ((curIndex, curString) in errorFileList.withIndex()) {
|
||||||
final int maxSendMail = 5;
|
val file = File("$filePath/$curString")
|
||||||
int curIndex = 0;
|
if (curIndex <= maxSendMail) {
|
||||||
for (final String curString : errorFileList) {
|
errorStringBuilder.append("New Trace collected:\n$longBorder\n")
|
||||||
final File file = new File(filePath + '/' + curString);
|
BufferedReader(FileReader(file)).use { input ->
|
||||||
|
var line: String?
|
||||||
if (curIndex++ <= maxSendMail) {
|
while (input.readLine().also { line = it } != null) errorStringBuilder.append(line).append("\n")
|
||||||
errorStringBuilder.append("New Trace collected:\r\n=====================\r\n");
|
|
||||||
try (final BufferedReader input = new BufferedReader(new FileReader(file))) {
|
|
||||||
String line;
|
|
||||||
while ((line = input.readLine()) != null)
|
|
||||||
errorStringBuilder.append(line).append("\r\n");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//noinspection ResultOfMethodCallIgnored
|
file.delete()
|
||||||
file.delete();
|
|
||||||
}
|
}
|
||||||
|
errorStringBuilder.append("\n\n")
|
||||||
errorStringBuilder.append("\r\n\r\n");
|
val resources = context.resources
|
||||||
final Resources resources = context.getResources();
|
context.startActivity(
|
||||||
context.startActivity(Intent.createChooser(
|
Intent.createChooser(
|
||||||
new Intent(Intent.ACTION_SEND)
|
Intent(Intent.ACTION_SEND).apply {
|
||||||
.setType("message/rfc822")
|
type = "message/rfc822"
|
||||||
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
|
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||||
| Intent.FLAG_GRANT_READ_URI_PERMISSION
|
putExtra(Intent.EXTRA_EMAIL, arrayOf(Constants.CRASH_REPORT_EMAIL))
|
||||||
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
|
putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.crash_report_subject))
|
||||||
.putExtra(Intent.EXTRA_EMAIL, new String[]{Constants.CRASH_REPORT_EMAIL})
|
putExtra(Intent.EXTRA_TEXT, errorStringBuilder.toString().replace("\n", "\r\n"))
|
||||||
// .putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(application, BuildConfig.APPLICATION_ID + ".provider", crashLogsZip))
|
},
|
||||||
.putExtra(Intent.EXTRA_SUBJECT, resources.getString(R.string.crash_report_subject))
|
context.resources.getString(R.string.crash_report_title)
|
||||||
.putExtra(Intent.EXTRA_TEXT, errorStringBuilder.toString()),
|
)
|
||||||
context.getResources().getString(R.string.crash_report_title))
|
)
|
||||||
);
|
} catch (e: Exception) {
|
||||||
} catch (final Exception e) {
|
Log.e(TAG, "", e)
|
||||||
Log.e(TAG, "", e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user