mirror of
https://github.com/AngelAuraMC/Amethyst-Android.git
synced 2025-09-10 21:25:30 -04:00
Better launcher crash report
This commit is contained in:
parent
0932fcad09
commit
8df8c90d34
@ -1,17 +1,25 @@
|
|||||||
package net.kdt.pojavlaunch;
|
package net.kdt.pojavlaunch;
|
||||||
|
|
||||||
|
import android.app.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
import android.os.*;
|
import android.os.*;
|
||||||
import android.support.v7.app.*;
|
import android.support.v7.app.*;
|
||||||
|
import android.util.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.datatransfer.*;
|
||||||
|
|
||||||
|
import android.support.v7.app.AlertDialog;
|
||||||
|
|
||||||
public class FatalErrorActivity extends AppCompatActivity
|
public class FatalErrorActivity extends AppCompatActivity
|
||||||
{
|
{
|
||||||
public static void showError(Context ctx, boolean isFatalErr, Throwable th) {
|
public static void showError(Context ctx, String savePath, boolean storageAllow, /* boolean isFatalErr, */ Throwable th) {
|
||||||
Intent ferrorIntent = new Intent(ctx, FatalErrorActivity.class);
|
Intent ferrorIntent = new Intent(ctx, FatalErrorActivity.class);
|
||||||
ferrorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
ferrorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
|
||||||
ferrorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
ferrorIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
ferrorIntent.putExtra("throwable", th);
|
ferrorIntent.putExtra("throwable", th);
|
||||||
ferrorIntent.putExtra("isFatal", isFatalErr);
|
ferrorIntent.putExtra("savePath", savePath);
|
||||||
|
ferrorIntent.putExtra("storageAllow", storageAllow);
|
||||||
|
// ferrorIntent.putExtra("isFatal", isFatalErr);
|
||||||
ctx.startActivity(ferrorIntent);
|
ctx.startActivity(ferrorIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -20,9 +28,46 @@ public class FatalErrorActivity extends AppCompatActivity
|
|||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
Bundle extras = getIntent().getExtras();
|
Bundle extras = getIntent().getExtras();
|
||||||
Throwable th = (Throwable) extras.getSerializable("throwable");
|
boolean storageAllow = extras.getBoolean("storageAllow");
|
||||||
boolean isFatalError = extras.getBoolean("isFatal", false);
|
final String strStackTrace = Log.getStackTraceString((Throwable) extras.getSerializable("throwable"));
|
||||||
|
String strSavePath = extras.getString("savePath");
|
||||||
|
String errHeader = storageAllow ?
|
||||||
|
"Crash stack trace saved to " + strSavePath + "." :
|
||||||
|
"Storage permission is required to save crash stack trace!";
|
||||||
|
|
||||||
Tools.showError(this, isFatalError ? R.string.error_fatal : R.string.global_error, th, true);
|
// boolean isFatalError = extras.getBoolean("isFatal", false);
|
||||||
|
|
||||||
|
new AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.error_fatal)
|
||||||
|
.setMessage(errHeader + "\n\n" + strStackTrace)
|
||||||
|
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface p1, int p2) {
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(R.string.global_restart, new DialogInterface.OnClickListener(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface p1, int p2) {
|
||||||
|
startActivity(new Intent(FatalErrorActivity.this, PojavLoginActivity.class));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNeutralButton(android.R.string.copy, new DialogInterface.OnClickListener(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface p1, int p2) {
|
||||||
|
StringSelection errData = new StringSelection(strStackTrace);
|
||||||
|
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(errData, null);
|
||||||
|
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
//.setNegativeButton("Report (not available)", null)
|
||||||
|
.setCancelable(false)
|
||||||
|
.show();
|
||||||
|
|
||||||
|
// Tools.showError(this, isFatalError ? R.string.error_fatal : R.string.global_error, th, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,16 +9,44 @@ import net.kdt.pojavlaunch.value.customcontrols.*;
|
|||||||
import android.support.v7.preference.*;
|
import android.support.v7.preference.*;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import android.content.*;
|
import android.content.*;
|
||||||
|
import android.support.v4.app.*;
|
||||||
|
import android.util.*;
|
||||||
|
import net.kdt.pojavlaunch.exit.*;
|
||||||
|
import java.time.*;
|
||||||
|
import java.text.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
public class PojavApplication extends Application
|
public class PojavApplication extends Application
|
||||||
{
|
{
|
||||||
|
public static String CRASH_REPORT_TAG = "PojavCrashReport";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
|
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler(){
|
||||||
@Override
|
@Override
|
||||||
public void uncaughtException(Thread thread, Throwable th) {
|
public void uncaughtException(Thread thread, Throwable th) {
|
||||||
FatalErrorActivity.showError(PojavApplication.this, true, th);
|
boolean storagePermAllowed = Build.VERSION.SDK_INT < 23 || ActivityCompat.checkSelfPermission(PojavApplication.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
|
||||||
android.os.Process.killProcess(android.os.Process.myPid());
|
File crashFile = new File(storagePermAllowed ? Tools.MAIN_PATH : Tools.datapath, "latestcrash.txt");
|
||||||
|
try {
|
||||||
|
// Write to file, since some devices may not able to show error
|
||||||
|
crashFile.createNewFile();
|
||||||
|
PrintStream crashStream = new PrintStream(crashFile);
|
||||||
|
crashStream.append("PojavLauncher crash report\n");
|
||||||
|
crashStream.append(" - Time: " + DateFormat.getDateTimeInstance().format(new Date()));
|
||||||
|
crashStream.append(" - Device: " + Build.PRODUCT + " " + Build.MODEL);
|
||||||
|
crashStream.append(" - Android version: " + Build.VERSION.RELEASE);
|
||||||
|
crashStream.append(" - Crash stack trace:");
|
||||||
|
crashStream.append(Log.getStackTraceString(th));
|
||||||
|
crashStream.close();
|
||||||
|
} catch (Throwable th2) {
|
||||||
|
Log.e(CRASH_REPORT_TAG, " - Exception attempt saving crash stack trace:", th2);
|
||||||
|
Log.e(CRASH_REPORT_TAG, " - The crash stack trace was:", th);
|
||||||
|
}
|
||||||
|
|
||||||
|
FatalErrorActivity.showError(PojavApplication.this, crashFile.getAbsolutePath(), storagePermAllowed, th);
|
||||||
|
// android.os.Process.killProcess(android.os.Process.myPid());
|
||||||
|
|
||||||
|
MainActivity.fullyExit();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -118,6 +118,7 @@
|
|||||||
<string name="global_load">Load</string>
|
<string name="global_load">Load</string>
|
||||||
<string name="global_name">Name</string>
|
<string name="global_name">Name</string>
|
||||||
<string name="global_remove">Remove</string>
|
<string name="global_remove">Remove</string>
|
||||||
|
<string name="global_restart">Restart</string>
|
||||||
<string name="global_save">Save</string>
|
<string name="global_save">Save</string>
|
||||||
<string name="global_error_field_empty">This field can\'t be empty</string>
|
<string name="global_error_field_empty">This field can\'t be empty</string>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user