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 @@ - - - - - - - - -