diff --git a/app/build.gradle b/app/build.gradle
index 5f6c280a0..4e4979550 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -112,6 +112,9 @@ dependencies {
implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0'
implementation 'com.github.solkin:disk-lru-cache:1.4'
+ implementation 'ch.acra:acra-mail:5.9.3'
+ implementation 'ch.acra:acra-dialog:5.9.3'
+
debugImplementation 'org.jsoup:jsoup:1.15.1'
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e1688abcf..72cfa4f2c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -68,11 +68,6 @@
android:name="org.koitharu.kotatsu.settings.sources.auth.SourceAuthActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:windowSoftInputMode="adjustResize" />
-
-
diff --git a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt
index e00dd1680..8035a83fc 100644
--- a/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/KotatsuApp.kt
@@ -1,9 +1,15 @@
package org.koitharu.kotatsu
import android.app.Application
+import android.content.Context
import android.os.StrictMode
import androidx.appcompat.app.AppCompatDelegate
import androidx.fragment.app.strictmode.FragmentStrictMode
+import org.acra.ReportField
+import org.acra.config.dialog
+import org.acra.config.mailSender
+import org.acra.data.StringFormat
+import org.acra.ktx.initAcra
import org.koin.android.ext.android.get
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
@@ -13,7 +19,6 @@ import org.koitharu.kotatsu.core.db.databaseModule
import org.koitharu.kotatsu.core.github.githubModule
import org.koitharu.kotatsu.core.network.networkModule
import org.koitharu.kotatsu.core.prefs.AppSettings
-import org.koitharu.kotatsu.core.ui.AppCrashHandler
import org.koitharu.kotatsu.core.ui.uiModule
import org.koitharu.kotatsu.details.detailsModule
import org.koitharu.kotatsu.favourites.favouritesModule
@@ -41,7 +46,6 @@ class KotatsuApp : Application() {
enableStrictMode()
}
initKoin()
- Thread.setDefaultUncaughtExceptionHandler(AppCrashHandler(applicationContext))
AppCompatDelegate.setDefaultNightMode(get().theme)
registerActivityLifecycleCallbacks(get())
registerActivityLifecycleCallbacks(get())
@@ -75,6 +79,36 @@ class KotatsuApp : Application() {
}
}
+ override fun attachBaseContext(base: Context?) {
+ super.attachBaseContext(base)
+ initAcra {
+ buildConfigClass = BuildConfig::class.java
+ reportFormat = StringFormat.KEY_VALUE_LIST
+ reportContent = listOf(
+ ReportField.PACKAGE_NAME,
+ ReportField.APP_VERSION_CODE,
+ ReportField.APP_VERSION_NAME,
+ ReportField.ANDROID_VERSION,
+ ReportField.PHONE_MODEL,
+ ReportField.CRASH_CONFIGURATION,
+ ReportField.STACK_TRACE,
+ ReportField.SHARED_PREFERENCES,
+ )
+ dialog {
+ text = getString(R.string.crash_text)
+ title = getString(R.string.error_occurred)
+ positiveButtonText = getString(R.string.send)
+ resIcon = R.drawable.ic_alert_outline
+ resTheme = android.R.style.Theme_Material_Light_Dialog_Alert
+ }
+ mailSender {
+ mailTo = getString(R.string.email_error_report)
+ reportAsFile = true
+ reportFileName = "stacktrace.txt"
+ }
+ }
+ }
+
private fun enableStrictMode() {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt
index 9cdce9654..bd172d695 100644
--- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt
@@ -12,7 +12,6 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.ActionBarContextView
import androidx.appcompat.widget.Toolbar
-import androidx.core.app.ActivityCompat
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
@@ -83,8 +82,9 @@ abstract class BaseActivity :
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (BuildConfig.DEBUG && keyCode == KeyEvent.KEYCODE_VOLUME_UP) { // TODO remove
- ActivityCompat.recreate(this)
- return true
+ // ActivityCompat.recreate(this)
+ throw RuntimeException("Test crash")
+ // return true
}
return super.onKeyDown(keyCode, event)
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/AppCrashHandler.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/AppCrashHandler.kt
deleted file mode 100644
index fb3216cb2..000000000
--- a/app/src/main/java/org/koitharu/kotatsu/core/ui/AppCrashHandler.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.koitharu.kotatsu.core.ui
-
-import android.content.Context
-import android.content.Intent
-import android.util.Log
-import kotlin.system.exitProcess
-import org.koitharu.kotatsu.utils.ext.printStackTraceDebug
-
-class AppCrashHandler(private val applicationContext: Context) : Thread.UncaughtExceptionHandler {
-
- override fun uncaughtException(t: Thread, e: Throwable) {
- val intent = CrashActivity.newIntent(applicationContext, e)
- intent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
- try {
- applicationContext.startActivity(intent)
- } catch (t: Throwable) {
- t.printStackTraceDebug()
- }
- Log.e("CRASH", e.message, e)
- exitProcess(1)
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/core/ui/CrashActivity.kt b/app/src/main/java/org/koitharu/kotatsu/core/ui/CrashActivity.kt
deleted file mode 100644
index 7d4d31878..000000000
--- a/app/src/main/java/org/koitharu/kotatsu/core/ui/CrashActivity.kt
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.koitharu.kotatsu.core.ui
-
-import android.app.Activity
-import android.content.ActivityNotFoundException
-import android.content.Context
-import android.content.Intent
-import android.net.Uri
-import android.os.Bundle
-import android.view.Menu
-import android.view.MenuItem
-import android.view.View
-import org.koitharu.kotatsu.R
-import org.koitharu.kotatsu.databinding.ActivityCrashBinding
-import org.koitharu.kotatsu.main.ui.MainActivity
-import org.koitharu.kotatsu.parsers.util.ellipsize
-import org.koitharu.kotatsu.utils.ShareHelper
-
-class CrashActivity : Activity(), View.OnClickListener {
-
- private lateinit var binding: ActivityCrashBinding
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- binding = ActivityCrashBinding.inflate(layoutInflater)
- setContentView(binding.root)
- binding.textView.text = intent.getStringExtra(Intent.EXTRA_TEXT)
- binding.buttonClose.setOnClickListener(this)
- binding.buttonRestart.setOnClickListener(this)
- binding.buttonReport.setOnClickListener(this)
- }
-
- override fun onCreateOptionsMenu(menu: Menu?): Boolean {
- menuInflater.inflate(R.menu.opt_crash, menu)
- return super.onCreateOptionsMenu(menu)
- }
-
- override fun onOptionsItemSelected(item: MenuItem): Boolean {
- when (item.itemId) {
- R.id.action_share -> {
- ShareHelper(this).shareText(binding.textView.text.toString())
- }
- else -> return super.onOptionsItemSelected(item)
- }
- return true
- }
-
- override fun onClick(v: View) {
- when (v.id) {
- R.id.button_close -> {
- finish()
- }
- R.id.button_restart -> {
- val intent = Intent(applicationContext, MainActivity::class.java)
- intent.flags = (Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
- startActivity(intent)
- finish()
- }
- R.id.button_report -> {
- val intent = Intent(Intent.ACTION_VIEW)
- intent.data = Uri.parse("https://github.com/nv95/Kotatsu/issues")
- try {
- startActivity(Intent.createChooser(intent, getString(R.string.report_github)))
- } catch (_: ActivityNotFoundException) {
- }
- }
- }
- }
-
- companion object {
-
- private const val MAX_TRACE_SIZE = 131071
-
- fun newIntent(context: Context, error: Throwable): Intent {
- val crashInfo = error
- .stackTraceToString()
- .trimIndent()
- .ellipsize(MAX_TRACE_SIZE)
- val intent = Intent(context, CrashActivity::class.java)
- intent.putExtra(Intent.EXTRA_TEXT, crashInfo)
- return intent
- }
- }
-}
\ No newline at end of file
diff --git a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt
index a424e7086..a8f0744bd 100644
--- a/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/download/ui/service/DownloadNotification.kt
@@ -11,8 +11,8 @@ import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
+import com.google.android.material.R as materialR
import org.koitharu.kotatsu.R
-import org.koitharu.kotatsu.core.ui.CrashActivity
import org.koitharu.kotatsu.details.ui.DetailsActivity
import org.koitharu.kotatsu.download.domain.DownloadState
import org.koitharu.kotatsu.download.ui.DownloadsActivity
@@ -20,7 +20,6 @@ import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.util.format
import org.koitharu.kotatsu.utils.PendingIntentCompat
import org.koitharu.kotatsu.utils.ext.getDisplayMessage
-import com.google.android.material.R as materialR
class DownloadNotification(private val context: Context, startId: Int) {
@@ -92,14 +91,6 @@ class DownloadNotification(private val context: Context, startId: Int) {
builder.setContentText(message)
builder.setAutoCancel(true)
builder.setOngoing(false)
- builder.setContentIntent(
- PendingIntent.getActivity(
- context,
- state.manga.hashCode(),
- CrashActivity.newIntent(context, state.error),
- PendingIntent.FLAG_CANCEL_CURRENT or PendingIntentCompat.FLAG_IMMUTABLE
- )
- )
builder.setCategory(NotificationCompat.CATEGORY_ERROR)
builder.setStyle(NotificationCompat.BigTextStyle().bigText(message))
}
diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt
index 5545b7562..51aedc866 100644
--- a/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt
+++ b/app/src/main/java/org/koitharu/kotatsu/tracker/work/TrackWorker.kt
@@ -216,10 +216,5 @@ class TrackWorker(context: Context, workerParams: WorkerParameters) :
works.any { x -> x.state == WorkInfo.State.RUNNING }
}
}
-
- suspend fun getInfo(context: Context): List {
- val query = WorkQuery.Builder.fromTags(listOf(TAG, TAG_ONESHOT)).build()
- return WorkManager.getInstance(context).getWorkInfos(query).await().orEmpty()
- }
}
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_crash.xml b/app/src/main/res/layout/activity_crash.xml
deleted file mode 100644
index f6a974b44..000000000
--- a/app/src/main/res/layout/activity_crash.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml
index fc2a18c3d..98011f83d 100644
--- a/app/src/main/res/values/constants.xml
+++ b/app/src/main/res/values/constants.xml
@@ -6,6 +6,7 @@
https://twitter.com/kotatsuapp
https://reddit.com/user/kotatsuapp
https://hosted.weblate.org/engage/kotatsu
+ kotatsu@waifu.club
- -1
- 1
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 369a5daaf..f056fd617 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -298,4 +298,6 @@
Automatically detect if manga is webtoon
Disable battery optimization
Helps with background updates checks
+ Something went wrong. Please submit a bug report to the developers to help us fix it.
+ Send
\ No newline at end of file