From 09004ae90a6aba3d28d4d0612e26bce931e2d634 Mon Sep 17 00:00:00 2001
From: Josiah Campbell <9521010+jocmp@users.noreply.github.com>
Date: Sun, 16 Jun 2024 15:15:08 -0500
Subject: [PATCH] Add Crashlytics (#103)
Adds Firebase Crashlytics with the intent to
make it opt-in behavior on the login screen and under settings.
---
.gitignore | 1 +
.idea/gradle.xml | 1 -
app/build.gradle.kts | 37 +++++++++++++++----
app/google-services-debug-only.json | 29 +++++++++++++++
app/src/main/AndroidManifest.xml | 4 +-
.../jocmp/capyreader/ui/login/LoginScreen.kt | 7 ++++
build.gradle.kts | 2 +
settings.gradle.kts | 6 +--
8 files changed, 75 insertions(+), 12 deletions(-)
create mode 100644 app/google-services-debug-only.json
diff --git a/.gitignore b/.gitignore
index d2530eb8..9a2e7046 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,3 +16,4 @@
local.properties
fastlane/report.xml
app/release/
+app/google-services.json
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index dc4f9667..f207c823 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -17,6 +17,5 @@
-
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 278a90ed..8853e921 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,7 +1,11 @@
+import com.android.build.gradle.internal.tasks.factory.dependsOn
+
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
kotlin("plugin.serialization") version libs.versions.kotlin
+ id("com.google.gms.google-services")
+ id("com.google.firebase.crashlytics")
}
android {
@@ -76,13 +80,13 @@ dependencies {
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
- implementation("androidx.core:core-ktx:1.13.0")
- implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0")
- implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
+ implementation("androidx.core:core-ktx:1.13.1")
+ implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.2")
+ implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.2")
implementation("androidx.navigation:navigation-compose:2.7.7")
- implementation("androidx.paging:paging-compose:3.2.1")
+ implementation("androidx.paging:paging-compose:3.3.0")
implementation("androidx.paging:paging-runtime-ktx:$pagingVersion")
- implementation("androidx.webkit:webkit:1.10.0")
+ implementation("androidx.webkit:webkit:1.11.0")
implementation("androidx.work:work-runtime-ktx:2.9.0")
implementation("app.cash.sqldelight:android-driver:$sqldelightVersion")
implementation("io.coil-kt:coil-compose:2.6.0")
@@ -95,14 +99,33 @@ dependencies {
implementation(libs.kotlinx.coroutines.core)
implementation(libs.kotlinx.serialization.json)
implementation(libs.okhttp.client)
- implementation(platform("androidx.compose:compose-bom:2024.04.01"))
+ implementation(platform("androidx.compose:compose-bom:2024.06.00"))
implementation(platform("io.insert-koin:koin-bom:3.5.1"))
implementation(project(":capy"))
+ implementation("com.google.firebase:firebase-crashlytics:19.0.1")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
- androidTestImplementation(platform("androidx.compose:compose-bom:2024.04.01"))
+ androidTestImplementation(platform("androidx.compose:compose-bom:2024.06.00"))
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
debugImplementation("androidx.compose.ui:ui-tooling")
debugImplementation("androidx.compose.ui:ui-test-manifest")
}
+
+tasks.register("useGoogleServicesDebugFile") {
+ description = "Copies the debug google-services.json file if file is missing."
+ doLast {
+ val googleServicesFile = "google-services.json"
+ if (!file("${project.projectDir}/$googleServicesFile").exists()) {
+ val debugOnlyFile = "google-services-debug-only.json"
+ println("$googleServicesFile file is missing. Copying $debugOnlyFile")
+ copy {
+ from("${project.projectDir}/$debugOnlyFile")
+ into(project.projectDir)
+ rename { googleServicesFile }
+ }
+ }
+ }
+}
+
+project.tasks.preBuild.dependsOn("useGoogleServicesDebugFile")
diff --git a/app/google-services-debug-only.json b/app/google-services-debug-only.json
new file mode 100644
index 00000000..13338e88
--- /dev/null
+++ b/app/google-services-debug-only.json
@@ -0,0 +1,29 @@
+{
+ "project_info": {
+ "project_number": "274059433914",
+ "project_id": "capy-reader-debug",
+ "storage_bucket": "capy-reader-debug.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:274059433914:android:2c1d21f3a0f12546c52f83",
+ "android_client_info": {
+ "package_name": "com.jocmp.capyreader"
+ }
+ },
+ "oauth_client": [],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAuMQpqtiSry6g2ecznF7cdCWgkxYN3nW8"
+ }
+ ],
+ "services": {
+ "appinvite_service": {
+ "other_platform_oauth_client": []
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b2c9d074..c18d0667 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -14,6 +14,9 @@
android:theme="@style/Theme.CapyReader"
android:enableOnBackInvokedCallback="true"
tools:targetApi="33">
+
-
diff --git a/app/src/main/java/com/jocmp/capyreader/ui/login/LoginScreen.kt b/app/src/main/java/com/jocmp/capyreader/ui/login/LoginScreen.kt
index 4c7c7581..63ad3a59 100644
--- a/app/src/main/java/com/jocmp/capyreader/ui/login/LoginScreen.kt
+++ b/app/src/main/java/com/jocmp/capyreader/ui/login/LoginScreen.kt
@@ -5,6 +5,7 @@ import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.ExperimentalComposeUiApi
@@ -12,6 +13,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.autofill.AutofillType.EmailAddress
import androidx.compose.ui.autofill.AutofillType.Password
import androidx.compose.ui.tooling.preview.Preview
+import com.google.firebase.crashlytics.ktx.crashlytics
+import com.google.firebase.ktx.Firebase
import com.jocmp.capyreader.ui.autofill
import org.koin.compose.koinInject
@@ -63,6 +66,10 @@ fun LoginScreen(
Text("Save")
}
}
+
+ LaunchedEffect(Unit) {
+ Firebase.crashlytics.setCrashlyticsCollectionEnabled(true)
+ }
}
@Preview
diff --git a/build.gradle.kts b/build.gradle.kts
index 58d248e2..7e9fecac 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -5,4 +5,6 @@ plugins {
id("org.jetbrains.kotlin.jvm") version libs.versions.kotlin apply false
id("com.android.library") version "8.3.1" apply false
id("org.jetbrains.kotlin.plugin.serialization") version libs.versions.kotlin
+ id("com.google.gms.google-services") version "4.4.2" apply false
+ id("com.google.firebase.crashlytics") version "3.0.1" apply false
}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 52942b39..b81b5326 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,8 +1,8 @@
pluginManagement {
repositories {
- google()
- mavenCentral()
gradlePluginPortal()
+ mavenCentral()
+ google()
}
}
@@ -21,7 +21,7 @@ dependencyResolutionManagement {
version("kotlin", "1.9.22")
version("sqldelight", "2.0.1")
version("ksp", "1.9.22-1.0.16")
- version("androidx-paging", "3.2.1")
+ version("androidx-paging", "3.3.0")
library("moshi", "com.squareup.moshi:moshi:1.15.1")
library("okhttp-client", "com.squareup.okhttp3:okhttp:4.12.0")
library("moshi-kotlin-codegen", "com.squareup.moshi:moshi-kotlin-codegen:1.14.0")