diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index bcce1f7..1326d83 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -24,6 +24,7 @@ jobs:
- name: Build with Gradle
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
run: ./gradlew assembleRelease
- name: Sign APK
id: sign_apk
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 0cb83e6..5ef6066 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -36,7 +36,7 @@ android {
buildConfigField("String", "REVANCED_API_URL", "\"https://releases.revanced.app\"")
buildConfigField("String", "GITHUB_API_URL", "\"https://api.github.com\"")
-
+ buildConfigField("String", "SENTRY_DSN", System.getenv("SENTRY_DSN") ?: "\"\"")
}
buildTypes {
@@ -129,4 +129,7 @@ dependencies {
implementation("io.ktor:ktor-client-okhttp:$ktorVersion")
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
+
+ // Sentry
+ implementation("io.sentry:sentry-android:6.7.0")
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 841ed8b..d1ee26c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -48,6 +48,10 @@
tools:node="remove" />
+
+
+ if (prefs.sentry) {
+ event
+ } else null
+ }
+ }
super.onCreate(savedInstanceState)
setContent {
ReVancedManagerTheme(
diff --git a/app/src/main/java/app/revanced/manager/domain/manager/PreferencesManager.kt b/app/src/main/java/app/revanced/manager/domain/manager/PreferencesManager.kt
index 7bef3dc..2e02795 100644
--- a/app/src/main/java/app/revanced/manager/domain/manager/PreferencesManager.kt
+++ b/app/src/main/java/app/revanced/manager/domain/manager/PreferencesManager.kt
@@ -16,4 +16,5 @@ class PreferencesManager(
var theme by enumPreference("theme", Theme.SYSTEM)
var srcPatches by stringPreference("src_patches", ghPatches)
var srcIntegrations by stringPreference("src_integrations", ghIntegrations)
+ var sentry by booleanPreference("sentry", true)
}
diff --git a/app/src/main/java/app/revanced/manager/network/api/ManagerAPI.kt b/app/src/main/java/app/revanced/manager/network/api/ManagerAPI.kt
index 0d92200..2249dc4 100644
--- a/app/src/main/java/app/revanced/manager/network/api/ManagerAPI.kt
+++ b/app/src/main/java/app/revanced/manager/network/api/ManagerAPI.kt
@@ -15,6 +15,7 @@ import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.util.cio.*
import io.ktor.utils.io.*
+import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.File
@@ -52,6 +53,7 @@ class ManagerAPI(
}
} catch (e: Exception) {
Log.e(tag, "An error occurred while downloading patches", e)
+ Sentry.captureException(e)
}
}
@@ -65,7 +67,6 @@ class ManagerAPI(
file
}
}
-
}
diff --git a/app/src/main/java/app/revanced/manager/network/service/GithubService.kt b/app/src/main/java/app/revanced/manager/network/service/GithubService.kt
index 6aebf95..a5ecc6d 100644
--- a/app/src/main/java/app/revanced/manager/network/service/GithubService.kt
+++ b/app/src/main/java/app/revanced/manager/network/service/GithubService.kt
@@ -7,7 +7,6 @@ import app.revanced.manager.network.dto.GithubContributor
import app.revanced.manager.network.dto.GithubReleases
import app.revanced.manager.network.utils.APIResponse
import app.revanced.manager.network.utils.getOrNull
-import app.revanced.manager.network.utils.getOrThrow
import io.ktor.client.request.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
@@ -42,7 +41,6 @@ class GithubServiceImpl(
override suspend fun findAsset(repo: String, file: String): PatchesAsset {
val releases = getReleases(repo).getOrNull() ?: throw Exception("Cannot retrieve assets")
-
val asset = releases.assets.find { asset ->
(asset.name.contains(file) && !asset.name.contains("-sources") && !asset.name.contains("-javadoc"))
} ?: throw MissingAssetException()
diff --git a/app/src/main/java/app/revanced/manager/patcher/PatcherUtils.kt b/app/src/main/java/app/revanced/manager/patcher/PatcherUtils.kt
index fc0b10b..bef6cd9 100644
--- a/app/src/main/java/app/revanced/manager/patcher/PatcherUtils.kt
+++ b/app/src/main/java/app/revanced/manager/patcher/PatcherUtils.kt
@@ -14,6 +14,7 @@ import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.patch.Patch
import app.revanced.patcher.util.patch.PatchBundle
import dalvik.system.DexClassLoader
+import io.sentry.Sentry
import java.util.*
class PatcherUtils(val app: Application) {
@@ -40,6 +41,7 @@ class PatcherUtils(val app: Application) {
} else throw IllegalStateException("No patch bundle(s) selected.")
} catch (e: Exception) {
Log.e(tag, "Failed to load patch bundle.", e)
+ Sentry.captureException(e)
}
}
diff --git a/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt
index 5e0f23a..a7b99cf 100644
--- a/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt
+++ b/app/src/main/java/app/revanced/manager/patcher/worker/PatcherWorker.kt
@@ -22,13 +22,11 @@ import app.revanced.manager.patcher.aligning.ZipAligner
import app.revanced.manager.patcher.aligning.zip.ZipFile
import app.revanced.manager.patcher.aligning.zip.structures.ZipEntry
import app.revanced.manager.patcher.signing.Signer
-import app.revanced.manager.ui.Resource
import app.revanced.manager.ui.viewmodel.Logging
import app.revanced.patcher.Patcher
import app.revanced.patcher.PatcherOptions
-import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.logging.Logger
-import app.revanced.patcher.patch.Patch
+import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.koin.core.component.KoinComponent
@@ -79,6 +77,7 @@ class PatcherWorker(
setForeground(ForegroundInfo(1, createNotification()))
} catch (e: Exception) {
Log.d(tag, "Failed to set foreground info:", e)
+ Sentry.captureException(e)
}
return try {
@@ -86,6 +85,7 @@ class PatcherWorker(
Result.success()
} catch (e: Exception) {
Log.e(tag, "Error while patching: ${e.message ?: e::class.simpleName}")
+ Sentry.captureException(e)
Result.failure()
}
}
@@ -176,7 +176,6 @@ class PatcherWorker(
Logging.log += "Failed to apply $patch" + result.exceptionOrNull()!!.cause + "\n"
return@forEach
}
-
}
Logging.log += "Saving file\n"
diff --git a/app/src/main/java/app/revanced/manager/ui/viewmodel/AppSelectorViewModel.kt b/app/src/main/java/app/revanced/manager/ui/viewmodel/AppSelectorViewModel.kt
index 0a082da..0aa00fc 100644
--- a/app/src/main/java/app/revanced/manager/ui/viewmodel/AppSelectorViewModel.kt
+++ b/app/src/main/java/app/revanced/manager/ui/viewmodel/AppSelectorViewModel.kt
@@ -12,6 +12,7 @@ import app.revanced.manager.patcher.PatcherUtils
import app.revanced.manager.ui.Resource
import app.revanced.manager.util.tag
import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages
+import io.sentry.Sentry
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -50,6 +51,7 @@ class AppSelectorViewModel(
Log.d(tag, "Filtered apps.")
} catch (e: Exception) {
Log.e(tag, "An error occurred while filtering", e)
+ Sentry.captureException(e)
}
}
@@ -82,6 +84,7 @@ class AppSelectorViewModel(
)
} catch (e: Exception) {
Log.e(tag, "Failed to load apk", e)
+ Sentry.captureException(e)
}
}
}
\ No newline at end of file