From 5b1a928e1bd6e91343f5407932d364a643dbcec5 Mon Sep 17 00:00:00 2001
From: Emmanuel Hansen <emmausssss@gmail.com>
Date: Fri, 27 Oct 2023 07:54:04 +0000
Subject: [PATCH] android - add crash handler

---
 .../java/org/ryujinx/android/BaseActivity.kt     | 16 ++++++++++++++++
 .../java/org/ryujinx/android/CrashHandler.kt     | 13 +++++++++++++
 .../java/org/ryujinx/android/GameActivity.kt     |  3 +--
 .../java/org/ryujinx/android/MainActivity.kt     |  3 +--
 4 files changed, 31 insertions(+), 4 deletions(-)
 create mode 100644 src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/BaseActivity.kt
 create mode 100644 src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/CrashHandler.kt

diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/BaseActivity.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/BaseActivity.kt
new file mode 100644
index 000000000..d333a3ecc
--- /dev/null
+++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/BaseActivity.kt
@@ -0,0 +1,16 @@
+package org.ryujinx.android
+
+import android.os.Bundle
+import android.os.PersistableBundle
+import androidx.activity.ComponentActivity
+
+abstract class BaseActivity : ComponentActivity() {
+    companion object{
+        val crashHandler = CrashHandler()
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
+        Thread.setDefaultUncaughtExceptionHandler(crashHandler)
+        super.onCreate(savedInstanceState, persistentState)
+    }
+}
diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/CrashHandler.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/CrashHandler.kt
new file mode 100644
index 000000000..2d6503020
--- /dev/null
+++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/CrashHandler.kt
@@ -0,0 +1,13 @@
+package org.ryujinx.android
+
+import java.io.File
+import java.lang.Thread.UncaughtExceptionHandler
+
+class CrashHandler : UncaughtExceptionHandler {
+    var crashLog : String = ""
+    override fun uncaughtException(t: Thread, e: Throwable) {
+        crashLog += e.toString() + "\n"
+
+        File(MainActivity.AppPath  + "${File.separator}crash.log").writeText(crashLog)
+    }
+}
diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameActivity.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameActivity.kt
index 37113912f..8dc39bfeb 100644
--- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameActivity.kt
+++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameActivity.kt
@@ -6,7 +6,6 @@ import android.content.pm.ActivityInfo
 import android.os.Bundle
 import android.view.KeyEvent
 import android.view.MotionEvent
-import androidx.activity.ComponentActivity
 import androidx.activity.compose.BackHandler
 import androidx.activity.compose.setContent
 import androidx.compose.foundation.layout.Arrangement
@@ -51,7 +50,7 @@ import org.ryujinx.android.viewmodels.QuickSettings
 import kotlin.math.abs
 import kotlin.math.roundToInt
 
-class GameActivity : ComponentActivity() {
+class GameActivity : BaseActivity() {
     private var physicalControllerManager: PhysicalControllerManager =
         PhysicalControllerManager(this)
 
diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt
index 5f3b95481..29fa53dbf 100644
--- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt
+++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt
@@ -4,7 +4,6 @@ import android.os.Build
 import android.os.Bundle
 import android.os.Environment
 import android.view.WindowManager
-import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.compose.foundation.layout.fillMaxSize
 import androidx.compose.material3.MaterialTheme
@@ -17,7 +16,7 @@ import org.ryujinx.android.viewmodels.MainViewModel
 import org.ryujinx.android.views.MainView
 
 
-class MainActivity : ComponentActivity() {
+class MainActivity : BaseActivity() {
     private var _isInit: Boolean = false
     var storageHelper: SimpleStorageHelper? = null
     companion object {