diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/KotatsuApp.kt b/app/src/main/kotlin/org/koitharu/kotatsu/KotatsuApp.kt index 164095e81..ee0de4d61 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/KotatsuApp.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/KotatsuApp.kt @@ -67,6 +67,10 @@ class KotatsuApp : Application(), Configuration.Provider { reportFormat = StringFormat.JSON excludeMatchingSharedPreferencesKeys = listOf( "sources_\\w+", + AppSettings.KEY_APP_PASSWORD, + AppSettings.KEY_PROXY_LOGIN, + AppSettings.KEY_PROXY_ADDRESS, + AppSettings.KEY_PROXY_PASSWORD, ) httpSender { uri = getString(R.string.url_error_report) @@ -83,6 +87,7 @@ class KotatsuApp : Application(), Configuration.Provider { ReportField.PHONE_MODEL, ReportField.STACK_TRACE, ReportField.CRASH_CONFIGURATION, + ReportField.CUSTOM_DATA, ReportField.SHARED_PREFERENCES, ) dialog { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/AppModule.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/AppModule.kt index 291118eec..c6d273615 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/AppModule.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/AppModule.kt @@ -29,13 +29,14 @@ import org.koitharu.kotatsu.core.cache.MemoryContentCache import org.koitharu.kotatsu.core.cache.StubContentCache import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.network.* -import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.core.os.AppShortcutManager +import org.koitharu.kotatsu.core.os.NetworkState import org.koitharu.kotatsu.core.parser.MangaLoaderContextImpl import org.koitharu.kotatsu.core.parser.MangaRepository import org.koitharu.kotatsu.core.parser.favicon.FaviconFetcher import org.koitharu.kotatsu.core.ui.image.CoilImageGetter import org.koitharu.kotatsu.core.ui.util.ActivityRecreationHandle +import org.koitharu.kotatsu.core.util.AcraScreenLogger import org.koitharu.kotatsu.core.util.IncognitoModeIndicator import org.koitharu.kotatsu.core.util.ext.activityManager import org.koitharu.kotatsu.core.util.ext.connectivityManager @@ -141,10 +142,12 @@ interface AppModule { appProtectHelper: AppProtectHelper, activityRecreationHandle: ActivityRecreationHandle, incognitoModeIndicator: IncognitoModeIndicator, + acraScreenLogger: AcraScreenLogger, ): Set<@JvmSuppressWildcards Application.ActivityLifecycleCallbacks> = arraySetOf( appProtectHelper, activityRecreationHandle, incognitoModeIndicator, + acraScreenLogger, ) @Provides diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt index be9a10694..9eb35d7f6 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BaseActivity.kt @@ -14,7 +14,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.content.ContextCompat import androidx.core.graphics.ColorUtils import androidx.core.view.ViewCompat @@ -104,7 +103,8 @@ abstract class BaseActivity : override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (BuildConfig.DEBUG && keyCode == KeyEvent.KEYCODE_VOLUME_UP) { - ActivityCompat.recreate(this) + // ActivityCompat.recreate(this) + error("Test") return true } return super.onKeyDown(keyCode, event) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/AcraScreenLogger.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/AcraScreenLogger.kt new file mode 100644 index 000000000..5d768b82f --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/AcraScreenLogger.kt @@ -0,0 +1,50 @@ +package org.koitharu.kotatsu.core.util + +import android.app.Activity +import android.content.Context +import android.os.Bundle +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentManager.FragmentLifecycleCallbacks +import org.acra.ACRA +import org.koitharu.kotatsu.core.ui.DefaultActivityLifecycleCallbacks +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class AcraScreenLogger @Inject constructor() : FragmentLifecycleCallbacks(), DefaultActivityLifecycleCallbacks { + + private val timeFormat = SimpleDateFormat.getTimeInstance(DateFormat.DEFAULT, Locale.ROOT) + + override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) { + super.onFragmentAttached(fm, f, context) + ACRA.errorReporter.putCustomData(f.key(), "${time()}: ${f.arguments}") + } + + override fun onFragmentDetached(fm: FragmentManager, f: Fragment) { + super.onFragmentDetached(fm, f) + ACRA.errorReporter.removeCustomData(f.key()) + } + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { + super.onActivityCreated(activity, savedInstanceState) + ACRA.errorReporter.putCustomData(activity.key(), "${time()}: ${activity.intent}") + (activity as? FragmentActivity)?.supportFragmentManager?.registerFragmentLifecycleCallbacks(this, true) + } + + override fun onActivityDestroyed(activity: Activity) { + super.onActivityDestroyed(activity) + ACRA.errorReporter.removeCustomData(activity.key()) + } + + private fun Activity.key() = "Activity[${javaClass.simpleName}]" + + private fun Fragment.key() = "Fragment[${javaClass.simpleName}]" + + private fun time() = timeFormat.format(Date()) +}