Revert "Revert "Revert "Replace Crashlytics with ACRA"""

This reverts commit ab45f33e
This commit is contained in:
William Brawner 2020-05-18 17:33:12 -07:00
parent b068a04dd4
commit 0e70364c6e
8 changed files with 29 additions and 68 deletions

1
app/.gitignore vendored
View file

@ -1,4 +1,3 @@
/build /build
*.apk *.apk
/release /release
acra.properties

View file

@ -3,6 +3,7 @@ apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android' apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-kapt'
apply plugin: 'jacoco' apply plugin: 'jacoco'
apply plugin: 'com.google.firebase.crashlytics'
def keystoreProperties = new Properties() def keystoreProperties = new Properties()
try { try {
@ -16,17 +17,6 @@ try {
keystoreProperties['storePassword'] = "" keystoreProperties['storePassword'] = ""
} }
def acraProperties = new Properties()
try {
def acraPropertiesFile = project.file("acra.properties")
acraProperties.load(new FileInputStream(acraPropertiesFile))
} catch (FileNotFoundException ignored) {
logger.warn("Unable to load ACRA properties. Error reporting won't be available")
acraProperties['url'] = ""
acraProperties['user'] = ""
acraProperties['pass'] = ""
}
android { android {
configurations.all { configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1' resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'
@ -55,9 +45,6 @@ android {
versionName "0.8.4" versionName "0.8.4"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField "boolean", "ENABLE_CUSTOM_CSS", "false" buildConfigField "boolean", "ENABLE_CUSTOM_CSS", "false"
buildConfigField "String", "ACRA_URL", "\"${acraProperties['url']}\""
buildConfigField "String", "ACRA_USER", "\"${acraProperties['user']}\""
buildConfigField "String", "ACRA_PASS", "\"${acraProperties['pass']}\""
} }
signingConfigs { signingConfigs {
release { release {
@ -110,8 +97,10 @@ dependencies {
implementation 'com.google.android.material:material:1.1.0' implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.legacy:legacy-support-v13:1.0.0' implementation 'androidx.legacy:legacy-support-v13:1.0.0'
implementation 'com.commonsware.cwac:anddown:0.3.0' implementation 'com.commonsware.cwac:anddown:0.3.0'
implementation 'com.google.firebase:firebase-core:17.4.1'
implementation 'com.android.billingclient:billing:2.2.0' implementation 'com.android.billingclient:billing:2.2.0'
implementation 'com.google.firebase:firebase-core:17.3.0'
implementation 'com.google.firebase:firebase-crashlytics:17.0.0-beta04'
implementation 'com.google.firebase:firebase-analytics:17.3.0'
implementation "androidx.core:core-ktx:1.2.0" implementation "androidx.core:core-ktx:1.2.0"
implementation 'androidx.browser:browser:1.2.0' implementation 'androidx.browser:browser:1.2.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
@ -123,14 +112,9 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" kapt "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation 'eu.crydee:syllable-counter:4.0.2' implementation 'eu.crydee:syllable-counter:4.0.2'
def acraVersion = '5.2.0-rc1'
implementation "ch.acra:acra-http:$acraVersion"
implementation "ch.acra:acra-advanced-scheduler:$acraVersion"
} }
apply plugin: 'com.google.gms.google-services' apply plugin: 'com.google.gms.google-services'
repositories { repositories {
mavenCentral() mavenCentral()
} }

View file

@ -1,14 +1,13 @@
package com.wbrawner.simplemarkdown package com.wbrawner.simplemarkdown
import android.app.Application import android.app.Application
import android.content.Context
import android.os.StrictMode import android.os.StrictMode
import com.wbrawner.simplemarkdown.utility.AcraErrorHandler import com.wbrawner.simplemarkdown.utility.CrashlyticsErrorHandler
import com.wbrawner.simplemarkdown.utility.ErrorHandler import com.wbrawner.simplemarkdown.utility.ErrorHandler
class MarkdownApplication : Application() { class MarkdownApplication : Application() {
val errorHandler: ErrorHandler by lazy { val errorHandler: ErrorHandler by lazy {
AcraErrorHandler() CrashlyticsErrorHandler()
} }
override fun onCreate() { override fun onCreate() {
@ -24,9 +23,4 @@ class MarkdownApplication : Application() {
} }
super.onCreate() super.onCreate()
} }
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
errorHandler.init(this)
}
} }

View file

@ -1,56 +1,27 @@
package com.wbrawner.simplemarkdown.utility package com.wbrawner.simplemarkdown.utility
import android.app.Application
import android.util.Log import android.util.Log
import com.evernote.android.job.JobRequest import com.google.firebase.crashlytics.FirebaseCrashlytics
import com.wbrawner.simplemarkdown.BuildConfig import com.wbrawner.simplemarkdown.BuildConfig
import org.acra.ACRA
import org.acra.config.CoreConfigurationBuilder
import org.acra.config.HttpSenderConfigurationBuilder
import org.acra.config.SchedulerConfigurationBuilder
import org.acra.data.StringFormat
import org.acra.sender.HttpSender
import java.util.concurrent.atomic.AtomicBoolean
interface ErrorHandler { interface ErrorHandler {
fun init(application: Application) fun enable(enable: Boolean)
fun reportException(t: Throwable, message: String? = null) fun reportException(t: Throwable, message: String? = null)
} }
class AcraErrorHandler : ErrorHandler { class CrashlyticsErrorHandler : ErrorHandler {
private val isInitialized = AtomicBoolean(false) private val crashlytics = FirebaseCrashlytics.getInstance()
override fun init(application: Application) { override fun enable(enable: Boolean) {
if (BuildConfig.ACRA_URL.isBlank() crashlytics.setCrashlyticsCollectionEnabled(enable)
|| BuildConfig.ACRA_USER.isBlank()
|| BuildConfig.ACRA_PASS.isBlank()) {
return
}
if (!isInitialized.getAndSet(true)) {
val builder = CoreConfigurationBuilder(application)
.setBuildConfigClass(BuildConfig::class.java)
.setReportFormat(StringFormat.JSON)
builder.getPluginConfigurationBuilder(HttpSenderConfigurationBuilder::class.java)
.setUri(BuildConfig.ACRA_URL)
.setHttpMethod(HttpSender.Method.POST)
.setBasicAuthLogin(BuildConfig.ACRA_USER)
.setBasicAuthPassword(BuildConfig.ACRA_PASS)
.setEnabled(true)
builder.getPluginConfigurationBuilder(SchedulerConfigurationBuilder::class.java)
.setRequiresNetworkType(JobRequest.NetworkType.UNMETERED)
.setRequiresBatteryNotLow(true)
.setEnabled(true)
ACRA.init(application, builder)
}
} }
override fun reportException(t: Throwable, message: String?) { override fun reportException(t: Throwable, message: String?) {
@Suppress("ConstantConditionIf") @Suppress("ConstantConditionIf")
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
Log.e("AcraErrorHandler", "Caught exception: $message", t) Log.e("CrashlyticsErrorHandler", "Caught exception: $message", t)
return return
} }
if (!isInitialized.get()) return crashlytics.recordException(t)
ACRA.getErrorReporter().handleException(t)
} }
} }

View file

@ -20,6 +20,7 @@ import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.wbrawner.simplemarkdown.MarkdownApplication
import com.wbrawner.simplemarkdown.R import com.wbrawner.simplemarkdown.R
import com.wbrawner.simplemarkdown.utility.hideKeyboard import com.wbrawner.simplemarkdown.utility.hideKeyboard
import com.wbrawner.simplemarkdown.view.adapter.EditPagerAdapter import com.wbrawner.simplemarkdown.view.adapter.EditPagerAdapter
@ -69,6 +70,17 @@ class MainActivity : AppCompatActivity(), ActivityCompat.OnRequestPermissionsRes
} }
} }
override fun onStart() {
super.onStart()
launch {
withContext(Dispatchers.IO) {
val enableErrorReports = PreferenceManager.getDefaultSharedPreferences(this@MainActivity)
.getBoolean(getString(R.string.error_reports_enabled), true)
(application as MarkdownApplication).errorHandler.enable(enableErrorReports)
}
}
}
override fun onUserLeaveHint() { override fun onUserLeaveHint() {
super.onUserLeaveHint() super.onUserLeaveHint()
launch { launch {

View file

@ -34,7 +34,7 @@
<string name="action_lock_swipe">Lock Swiping</string> <string name="action_lock_swipe">Lock Swiping</string>
<string name="action_select">Select</string> <string name="action_select">Select</string>
<string name="action_privacy">Privacy</string> <string name="action_privacy">Privacy</string>
<string name="pref_key_error_reports_enabled">acra.enable</string> <string name="error_reports_enabled">crashlytics.enable</string>
<string name="pref_title_error_reports">Enable automated error reports</string> <string name="pref_title_error_reports">Enable automated error reports</string>
<string name="pref_error_reports_off">Error reports will not be sent</string> <string name="pref_error_reports_off">Error reports will not be sent</string>
<string name="pref_error_reports_on">Error reports will be sent</string> <string name="pref_error_reports_on">Error reports will be sent</string>

View file

@ -19,7 +19,7 @@
android:title="@string/title_dark_mode" /> android:title="@string/title_dark_mode" />
<SwitchPreference <SwitchPreference
android:defaultValue="true" android:defaultValue="true"
android:key="@string/pref_key_error_reports_enabled" android:key="@string/error_reports_enabled"
android:summaryOff="@string/pref_error_reports_off" android:summaryOff="@string/pref_error_reports_off"
android:summaryOn="@string/pref_error_reports_on" android:summaryOn="@string/pref_error_reports_on"
android:title="@string/pref_title_error_reports" /> android:title="@string/pref_title_error_reports" />

View file

@ -9,6 +9,7 @@ buildscript {
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:3.6.3' classpath 'com.android.tools.build:gradle:3.6.3'
classpath 'com.google.gms:google-services:4.3.3' classpath 'com.google.gms:google-services:4.3.3'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0-beta04'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
} }
} }