From 51b82980e551b454c9931e837993e0340f3fe0b9 Mon Sep 17 00:00:00 2001 From: "aman.kapoor" Date: Sun, 9 Jan 2022 20:54:37 +0530 Subject: [PATCH] Near deploy changes --- .github/config/configuration.json | 54 ++ .github/config/labels.yml | 51 ++ .github/config/release-drafter.yml | 39 ++ .github/workflows/build.yml | 139 +++++ .github/workflows/gradle-wrapper.yml | 10 + .github/workflows/release-drafter.yml | 19 + .github/workflows/sync-labels.yml | 19 + build.gradle.kts | 64 ++- logo_icon.icns | Bin 0 -> 65035 bytes logo_icon.ico | Bin 0 -> 176207 bytes logo_icon.png | Bin 0 -> 13629 bytes src/main/kotlin/Main.kt | 31 +- src/main/kotlin/inputs/adb/CancelException.kt | 8 - .../kotlin/inputs/adb/ddmlib/AdbHelper.kt | 5 +- src/main/kotlin/inputs/adb/ddmlib/Devices.kt | 12 +- .../kotlin/inputs/adb/ddmlib/LogCatRunner.kt | 4 +- src/main/kotlin/processor/MainProcessor.kt | 18 +- src/main/kotlin/processor/QueryHelper.kt | 7 +- src/main/kotlin/storage/Db.kt | 3 - .../storage/serializer/ObjectSerializer.kt | 3 +- src/main/kotlin/ui/components/BodyHeader.kt | 2 + src/main/kotlin/ui/components/BodyPanel.kt | 9 +- .../kotlin/ui/components/NewSessionBox.kt | 1 + .../kotlin/ui/components/SideNavigation.kt | 16 +- .../{ => common}/BasicComponents.kt | 52 +- .../ui/components/dialogs/CrashDialog.kt | 34 ++ .../components/{ => dialogs}/CustomDialog.kt | 4 +- .../components/{ => dialogs}/ExportDialog.kt | 4 +- .../ui/components/{ => dialogs}/FaqDialog.kt | 3 +- .../ui/components/{ => dialogs}/FileDialog.kt | 2 +- .../components/{ => dialogs}/IntroDialog.kt | 3 +- .../{ => dialogs}/SettingsDialog.kt | 20 +- src/main/kotlin/utils/AppLog.kt | 9 + src/main/kotlin/utils/AppResources.kt | 8 +- .../kotlin/utils/CustomExceptionHandler.kt | 23 + src/main/kotlin/utils/Helpers.kt | 8 +- src/main/kotlin/utils/ItemObjectMapper.kt | 4 +- src/main/kotlin/utils/SentryHelper.kt | 33 ++ .../resources/icons/crash_illustration.xml | 528 ++++++++++++++++++ src/main/resources/log4j2.xml | 26 +- 40 files changed, 1157 insertions(+), 118 deletions(-) create mode 100644 .github/config/configuration.json create mode 100644 .github/config/labels.yml create mode 100644 .github/config/release-drafter.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/gradle-wrapper.yml create mode 100644 .github/workflows/release-drafter.yml create mode 100644 .github/workflows/sync-labels.yml create mode 100644 logo_icon.icns create mode 100644 logo_icon.ico create mode 100644 logo_icon.png delete mode 100644 src/main/kotlin/inputs/adb/CancelException.kt rename src/main/kotlin/ui/components/{ => common}/BasicComponents.kt (78%) create mode 100644 src/main/kotlin/ui/components/dialogs/CrashDialog.kt rename src/main/kotlin/ui/components/{ => dialogs}/CustomDialog.kt (98%) rename src/main/kotlin/ui/components/{ => dialogs}/ExportDialog.kt (97%) rename src/main/kotlin/ui/components/{ => dialogs}/FaqDialog.kt (97%) rename src/main/kotlin/ui/components/{ => dialogs}/FileDialog.kt (97%) rename src/main/kotlin/ui/components/{ => dialogs}/IntroDialog.kt (97%) rename src/main/kotlin/ui/components/{ => dialogs}/SettingsDialog.kt (89%) create mode 100644 src/main/kotlin/utils/CustomExceptionHandler.kt create mode 100644 src/main/kotlin/utils/SentryHelper.kt create mode 100644 src/main/resources/icons/crash_illustration.xml diff --git a/.github/config/configuration.json b/.github/config/configuration.json new file mode 100644 index 0000000..be6002f --- /dev/null +++ b/.github/config/configuration.json @@ -0,0 +1,54 @@ +{ + "categories": [ + { + "title": "## ๐Ÿš€ Features", + "labels": [ + "feat" + ] + }, + { + "title": "## ๐Ÿ› Fixes", + "labels": [ + "fix" + ] + }, + { + "title": "๐Ÿงฐ Maintenance", + "labels": [ + "chore" + ] + }, + { + "title": "## ๐Ÿงช Tests", + "labels": [ + "test" + ] + }, + { + "title": "## ๐Ÿ–๏ธ Documentation", + "labels": [ + "doc" + ] + }, + { + "title": "## ๐Ÿ“ฆ Dependencies", + "labels": [ + "dependencies" + ] + } + ], + "sort": "ASC", + "template": "${{CHANGELOG}}\n\n
\nUncategorized\n\n${{UNCATEGORIZED}}\n
", + "pr_template": "${{TITLE}}", + "empty_template": "- no changes", + "label_extractor": [ + { + "pattern": "(.+): (.+)", + "target": "$1" + } + ], + "exclude_merge_branches": [ + "merge pull request", + "Merge pull request" + ] +} \ No newline at end of file diff --git a/.github/config/labels.yml b/.github/config/labels.yml new file mode 100644 index 0000000..24a6530 --- /dev/null +++ b/.github/config/labels.yml @@ -0,0 +1,51 @@ +- name: bug + description: Something isn't working + color: d73a4a +- name: doc + description: Improvements to documentation + color: d4c5f9 +- name: duplicate + description: This issue or pull request already exists + color: cfd3d7 +- name: feature + color: 1d76db + description: New features +- name: enhancement + description: Enhancement of existing functionality + color: 84b6eb +- name: deprecated + description: Deprecating API + color: f4c21d +- name: removed + description: Removing API + color: e4b21d +- name: tests + description: Enhancement of tests + color: 0e8a16 +- name: java + description: Java/JDK changes + color: 03d0d6 +- name: gradle + description: Gradle changes + color: d0d603 +- name: maven + description: Maven changes + color: d60366 +- name: compose + description: Jetbrains Compose issues + color: 3cdc84 +- name: help + description: Help Wanted + color: 0e8a16 +- name: question + description: Questions and discussions + color: cc317c +- name: dependencies + description: Changes that affect dependencies + color: 5319e7 +- name: docker + description: Container changes + color: e99695 +- name: github-actions + description: Github action changes + color: ff7619 \ No newline at end of file diff --git a/.github/config/release-drafter.yml b/.github/config/release-drafter.yml new file mode 100644 index 0000000..3e13770 --- /dev/null +++ b/.github/config/release-drafter.yml @@ -0,0 +1,39 @@ +name-template: 'v$RESOLVED_VERSION ๐ŸŒˆ' +tag-template: 'v$RESOLVED_VERSION' +categories: + - title: '๐Ÿš€ Features' + labels: + - 'feat' + - 'feature' + - 'enhancement' + - title: '๐Ÿ› Bug Fixes' + labels: + - 'fix' + - 'bugfix' + - 'bug' + - title: '๐Ÿงฐ Maintenance' + label: 'chore' + - title: "๐Ÿ“ Documentation" + labels: + - 'doc' + - 'documentation' + - title: "๐Ÿงช Tests" + labels: + - 'test' +change-template: '- $TITLE @$AUTHOR (#$NUMBER)' +change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. +version-resolver: + major: + labels: + - 'major' + minor: + labels: + - 'minor' + patch: + labels: + - 'patch' + default: patch +template: | + ## Changes + + $CHANGES \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..9d5241e --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,139 @@ +name: Logvue Build + +env: + GITHUB_DEPLOY: 'false' + +on: + + pull_request: + branches: + - main + + workflow_dispatch: + repository_dispatch: + types: [ app-release ] + +defaults: + run: + shell: bash + +jobs: + build: + name: Build Package + timeout-minutes: 15 + continue-on-error: false + # if: github.event_name == 'pull_request' + + runs-on: ${{ matrix.os }} + environment: Production + env: + SENTRY_ENDPOINT: ${{ secrets.SENTRY_ENDPOINT }} + SENTRY_DEBUG: ${{ secrets.SENTRY_DEBUG }} + strategy: + fail-fast: true + matrix: + os: [ arm64, ubuntu-latest, macos-latest, windows-latest ] + jdk: [ 18 ] + + steps: + - name: Check out the source code + uses: actions/checkout@v2 + + - name: Download ${{ matrix.os }} OpenJDK ${{ matrix.jdk }} + id: download-jdk + uses: sormuras/download-jdk@v1 + with: + feature: ${{ matrix.jdk }} + + - name: Set up OpenJDK ${{ matrix.jdk }} + id: setup-java + uses: actions/setup-java@v2 + if: always() && steps.download-jdk.outcome == 'success' + with: + distribution: jdkfile + java-version: ${{ env.JDK_VERSION }} + jdkFile: ${{ env.JDK_FILE }} + + - name: Cache Gradle dependencies + uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Deploy to GitHub Packages (Linux) + id: gradle-deploy + if: env.GITHUB_DEPLOY == 'true' && runner.os == 'Linux' + run: | + ./gradlew deploy + env: + GITHUB_USER: ${{ github.repository_owner }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Gradle Build + id: gradle-build + run: ./gradlew packageUberJarForCurrentOS package -DSENTRY_ENDPOINT=env.SENTRY_ENDPOINT -DSENTRY_DEBUG=env.SENTRY_DEBUG + + - name: Uploading ${{ matrix.os }} uber jar + if: steps.gradle-build.outcome == 'success' + uses: actions/upload-artifact@v2 + with: + name: ${{ steps.gradle-build.outputs.uber_jar_name }} + path: | + ${{ steps.gradle-build.outputs.uber_jar_path }} + if-no-files-found: error + + - name: Uploading ${{ matrix.os }} native package + if: steps.gradle-build.outcome == 'success' + uses: actions/upload-artifact@v2 + with: + name: ${{ steps.gradle-build.outputs.app_pkg_name }} + path: | + ${{ steps.gradle-build.outputs.app_pkg_path }} + if-no-files-found: error + + + release: + name: Release new version. + needs: [ build ] + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - name: Check out the source code + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - uses: ffurrer2/extract-release-notes@v1.10.0 + id: extract_release_notes + if: ${{ false }} + + - name: Build Changelog + id: github_release + uses: mikepenz/release-changelog-builder-action@v2 + with: + configuration: ".github/config/configuration.json" + commitMode: true + ignorePreReleases: ${{ !contains(github.ref, '-') }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Download all the build artifacts + uses: actions/download-artifact@v2 + with: + path: release-artifacts + + - name: Github Release + uses: softprops/action-gh-release@v1 + with: + body: ${{ steps.github_release.outputs.changelog }} + prerelease: ${{ contains(github.event.inputs.version, '-rc') || contains(github.event.inputs.version, '-b') || contains(github.event.inputs.version, '-a') }} + files: | + ${{ github.workspace }}/release-artifacts/** + fail_on_unmatched_files: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/gradle-wrapper.yml b/.github/workflows/gradle-wrapper.yml new file mode 100644 index 0000000..ed37f78 --- /dev/null +++ b/.github/workflows/gradle-wrapper.yml @@ -0,0 +1,10 @@ +name: "Validate Gradle Wrapper" +on: [ push, pull_request ] + +jobs: + validation: + name: "Validation" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: gradle/wrapper-validation-action@v1 \ No newline at end of file diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml new file mode 100644 index 0000000..607a46d --- /dev/null +++ b/.github/workflows/release-drafter.yml @@ -0,0 +1,19 @@ +name: Release Drafter + +on: + push: + branches: + - main + pull_request: + types: [ opened, reopened, synchronize ] + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - name: Drafts next Release notes + uses: release-drafter/release-drafter@v5 + with: + config-name: config/release-drafter.yml + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml new file mode 100644 index 0000000..6533746 --- /dev/null +++ b/.github/workflows/sync-labels.yml @@ -0,0 +1,19 @@ +name: Sync labels + +on: + push: + branches: + - main + paths: + - .github/config/labels.yml + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: micnncim/action-label-syncer@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + manifest: .github/config/labels.yml \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 5dd598b..da33323 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,10 +5,11 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { kotlin("jvm") version "1.6.10" id("org.jetbrains.compose") version "1.0.1" + id("com.github.gmazzo.buildconfig") version "3.0.3" } -group = "com.gi" -version = "1.0" +group = "com.voxfinite" +version = "1.0.0" repositories { google() @@ -28,14 +29,14 @@ dependencies { // embedded database implementation("org.mapdb:mapdb:3.0.8") implementation("org.snakeyaml:snakeyaml-engine:2.3") - // https://mvnrepository.com/artifact/io.netty/netty-resolver-dns-native-macos - runtimeOnly("io.netty:netty-resolver-dns-native-macos:4.1.72.Final") // not sure if needed now +// runtimeOnly("io.netty:netty-resolver-dns-native-macos:4.1.72.Final") // not sure if needed now implementation("com.android.tools.ddms:ddmlib:30.2.0-alpha06") implementation("com.google.code.gson:gson:2.8.9") // https://mvnrepository.com/artifact/com.googlecode.cqengine/cqengine implementation("com.googlecode.cqengine:cqengine:3.6.0") implementation("org.jetbrains.kotlin:kotlin-reflect:1.6.10") - implementation("com.halilibo.compose-richtext:richtext-ui-material:0.10.0") + + implementation("io.sentry:sentry-log4j2:5.5.2") } tasks.test { @@ -55,8 +56,57 @@ compose.desktop { mainClass = "MainKt" nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) - packageName = "logvue" - packageVersion = "1.0.0" + packageName = project.name + packageVersion = "${project.version}" + description = "Local Analytics" + linux { + debMaintainer = "kapoor.aman22@gmail.com" + iconFile.set(project.file("logo_icon.png")) + } + macOS { + bundleID = "${project.group}.${project.name}" + iconFile.set(project.file("logo_icon.icns")) + } + windows { + upgradeUuid = "8AEBC8BF-9C94-4D02-ACA8-AF543E0CEB98" + iconFile.set(project.file("logo_icon.ico")) + } } } } + +buildConfig { + className("AppBuildConfig") + useKotlinOutput { topLevelConstants = true } + buildConfigField("String", "APP_NAME", "\"${project.name}\"") + buildConfigField("String", "APP_VERSION", "\"${project.version}\"") +} + +/** + * Sets the Github Action output as package name and path to use in other steps. + */ +gradle.buildFinished { + val pkgFormat = + compose.desktop.application.nativeDistributions.targetFormats.firstOrNull { it.isCompatibleWithCurrentOS } + val nativePkg = buildDir.resolve("compose/binaries").findPkg(pkgFormat?.fileExt) + val jarPkg = buildDir.resolve("compose/jars").findPkg(".jar") + nativePkg.ghActionOutput("app_pkg") + jarPkg.ghActionOutput("uber_jar") +} + +fun File.findPkg(format: String?) = when (format != null) { + true -> walk().firstOrNull { it.isFile && it.name.endsWith(format, ignoreCase = true) } + else -> null +} + +fun File?.ghActionOutput(prefix: String) = this?.let { + when (System.getenv("GITHUB_ACTIONS").toBoolean()) { + true -> println( + """ + ::set-output name=${prefix}_name::${it.name} + ::set-output name=${prefix}_path::${it.absolutePath} + """.trimIndent() + ) + else -> println("$prefix: $this") + } +} diff --git a/logo_icon.icns b/logo_icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..db8a1d21747ce2edd501cf07ed197a5422c6110c GIT binary patch literal 65035 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%0Dx&` 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 literal 0 HcmV?d00001 diff --git a/logo_icon.ico b/logo_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5acaf62f177118678f28b11b939ebf137290bd6 GIT binary patch literal 176207 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 M+q!Cnx2&K2f3Br@NdN!< literal 0 HcmV?d00001 diff --git a/src/main/kotlin/Main.kt b/src/main/kotlin/Main.kt index e2644c9..7030ee7 100644 --- a/src/main/kotlin/Main.kt +++ b/src/main/kotlin/Main.kt @@ -21,13 +21,13 @@ import storage.Db import ui.AppTheme import ui.CustomTheme import ui.components.BodyPanel -import ui.components.IntroDialog import ui.components.SideNavigation -import utils.APP_NAME -import utils.AppLog -import utils.Helpers +import ui.components.dialogs.CrashDialog +import ui.components.dialogs.IntroDialog +import utils.* import java.awt.Desktop + @Composable @Preview fun App() { @@ -49,20 +49,32 @@ fun App() { AdbHelper.init() } LaunchIntroIfNeeded() + LaunchCrashDialogIfNeeded() } } @Composable fun LaunchIntroIfNeeded() { - var introLaunched by remember { mutableStateOf(Db.configs["isIntroLaunched"].toBoolean()) } + var introLaunched by remember { mutableStateOf(AppSettings.getFlag("isIntroLaunched")) } if (!introLaunched) { IntroDialog { - Db.configs["isIntroLaunched"] = "true" + AppSettings.setFlag("isIntroLaunched", true) introLaunched = true } } } +@Composable +fun LaunchCrashDialogIfNeeded() { + if (!CustomExceptionHandler.isLastTimeCrashed()) return + var launched by remember { mutableStateOf(true) } + if (launched) { + CrashDialog { + launched = false + } + } +} + @OptIn(ExperimentalComposeUiApi::class) fun main() = application(false) { fun onClose(source: String) { @@ -78,11 +90,10 @@ fun main() = application(false) { onClose("User Close") exitApplication() } + Thread.setDefaultUncaughtExceptionHandler(CustomExceptionHandler()) + SentryHelper.init() val windowState = rememberWindowState(WindowPlacement.Floating, size = DpSize(1440.dp, 1024.dp)) - Window(onCloseRequest = onCloseRequest, title = APP_NAME, state = windowState) { -// window.exceptionHandler = WindowExceptionHandler { -// println(it) -// } + Window(onCloseRequest = onCloseRequest, title = CustomTheme.strings.appName, state = windowState) { App() } } diff --git a/src/main/kotlin/inputs/adb/CancelException.kt b/src/main/kotlin/inputs/adb/CancelException.kt deleted file mode 100644 index 56db764..0000000 --- a/src/main/kotlin/inputs/adb/CancelException.kt +++ /dev/null @@ -1,8 +0,0 @@ -package inputs.adb - -class CancelException : Exception { - constructor() : super("Logging is Cancelled") - constructor(message: String) : super(message) - constructor(message: String, cause: Throwable) : super(message, cause) - constructor(cause: Throwable) : super("Logging is Cancelled", cause) -} diff --git a/src/main/kotlin/inputs/adb/ddmlib/AdbHelper.kt b/src/main/kotlin/inputs/adb/ddmlib/AdbHelper.kt index c08f20a..5bd9416 100644 --- a/src/main/kotlin/inputs/adb/ddmlib/AdbHelper.kt +++ b/src/main/kotlin/inputs/adb/ddmlib/AdbHelper.kt @@ -17,6 +17,7 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.withContext import models.LogCatMessage2 import utils.Either +import utils.reportException import java.io.File import java.util.* import java.util.concurrent.TimeUnit @@ -50,7 +51,7 @@ object AdbHelper { try { AndroidDebugBridge.terminate() } catch (e: Exception) { - // ignore + e.reportException() } } @@ -81,7 +82,6 @@ object AdbHelper { clientPid = client.clientData.pid } if (clientPid < 0) { - println("Client is null") send(Either.Left(LogErrorPackageIssue)) close() awaitClose() @@ -127,6 +127,7 @@ object AdbHelper { val androidEnvHome: File? = try { System.getenv("ANDROID_HOME") ?: System.getenv("ANDROID_SDK_ROOT") } catch (e: SecurityException) { + e.reportException() null }?.let { File(it) } diff --git a/src/main/kotlin/inputs/adb/ddmlib/Devices.kt b/src/main/kotlin/inputs/adb/ddmlib/Devices.kt index 3793c29..bb11d3b 100644 --- a/src/main/kotlin/inputs/adb/ddmlib/Devices.kt +++ b/src/main/kotlin/inputs/adb/ddmlib/Devices.kt @@ -10,7 +10,7 @@ class Devices : AndroidDebugBridge.IDeviceChangeListener { companion object { private val _devicesFlow: MutableStateFlow> = MutableStateFlow(emptyList()) val devicesFlow: MutableStateFlow> = _devicesFlow - private val devices: HashSet = hashSetOf() + private val connectedDevices: HashSet = hashSetOf() private val _currentDeviceFlow: MutableStateFlow = MutableStateFlow(null) val currentDeviceFlow = _currentDeviceFlow @@ -24,23 +24,23 @@ class Devices : AndroidDebugBridge.IDeviceChangeListener { override fun deviceConnected(device: IDevice) { val details2 = DeviceDetails2(device) - devices.add(details2) + connectedDevices.add(details2) _devicesFlow.value = currentDevices() } override fun deviceDisconnected(device: IDevice) { val details2 = DeviceDetails2(device) - devices.remove(details2) + connectedDevices.remove(details2) _devicesFlow.value = currentDevices() } override fun deviceChanged(device: IDevice, changeMask: Int) { var details2 = DeviceDetails2(device) - devices.remove(details2) + connectedDevices.remove(details2) details2 = DeviceDetails2(device) - devices.add(details2) + connectedDevices.add(details2) _devicesFlow.value = currentDevices() } - private fun currentDevices() = devices.toList().sortedBy { it.sortKey() } + private fun currentDevices() = connectedDevices.toList().sortedBy { it.sortKey() } } diff --git a/src/main/kotlin/inputs/adb/ddmlib/LogCatRunner.kt b/src/main/kotlin/inputs/adb/ddmlib/LogCatRunner.kt index 5ec8af6..a4370a9 100644 --- a/src/main/kotlin/inputs/adb/ddmlib/LogCatRunner.kt +++ b/src/main/kotlin/inputs/adb/ddmlib/LogCatRunner.kt @@ -4,9 +4,9 @@ import com.android.ddmlib.* import com.android.ddmlib.logcat.LogCatMessageParser import models.LogCatHeader2 import models.LogCatMessage2 +import utils.reportException import java.io.IOException import java.time.Instant -import java.util.* import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import javax.annotation.concurrent.GuardedBy @@ -61,9 +61,11 @@ class LogCatRunner( } catch (e: TimeoutException) { notifyListeners(arrayListOf(sConnectionTimeoutMsg)) } catch (ignored: AdbCommandRejectedException) { + ignored.reportException() // will not be thrown as long as the shell supports logcat } catch (ignored: ShellCommandUnresponsiveException) { // this will not be thrown since the last argument is 0 + ignored.reportException() } catch (e: IOException) { notifyListeners(arrayListOf(sConnectionErrorMsg)) } diff --git a/src/main/kotlin/processor/MainProcessor.kt b/src/main/kotlin/processor/MainProcessor.kt index dc23438..1eb39ed 100644 --- a/src/main/kotlin/processor/MainProcessor.kt +++ b/src/main/kotlin/processor/MainProcessor.kt @@ -4,6 +4,8 @@ import com.android.ddmlib.Log import inputs.adb.AndroidLogStreamer import inputs.adb.LogCatErrors import inputs.adb.LogErrorNoSession +import io.sentry.Sentry +import io.sentry.SpanStatus import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch @@ -11,10 +13,10 @@ import kotlinx.coroutines.withContext import models.LogItem import models.SessionInfo import storage.Db -import utils.AppLog import utils.Helpers import utils.failureOrNull import utils.getOrNull +import utils.reportException class MainProcessor { @@ -125,11 +127,17 @@ class MainProcessor { if (!isNewStream) { indexedCollection.clear() } + val sentryTransaction = Sentry.startTransaction("filterLogs", "filter", true) + sentryTransaction.setData("query", filterQuery ?: "") try { filterLogs(indexedCollection, list, parser, fQuery) } catch (e: Exception) { - e.printStackTrace() + e.reportException() + sentryTransaction.throwable = e + sentryTransaction.status = SpanStatus.INTERNAL_ERROR listOf(LogItem.errorContent("Error in query\n${e.message}")) + } finally { + sentryTransaction.finish() } } if (filterResult.isEmpty() && !isNewStream) { @@ -141,10 +149,6 @@ class MainProcessor { } fun pause() { - try { - streamer.stop() - } catch (e: Exception) { - AppLog.d("unnecessary", "keeping exception for now in pause") - } + streamer.stop() } } diff --git a/src/main/kotlin/processor/QueryHelper.kt b/src/main/kotlin/processor/QueryHelper.kt index 2ec2838..4d7628d 100644 --- a/src/main/kotlin/processor/QueryHelper.kt +++ b/src/main/kotlin/processor/QueryHelper.kt @@ -11,6 +11,7 @@ import com.googlecode.cqengine.index.radixreversed.ReversedRadixTreeIndex import com.googlecode.cqengine.query.parser.sql.SQLParser import models.LogItem import utils.AppLog +import utils.reportException import kotlin.reflect.KProperty1 import kotlin.time.ExperimentalTime import kotlin.time.measureTimedValue @@ -48,7 +49,6 @@ fun filterLogs( ): List { indexedCollection.addAll(list) registerPropertiesInParser(list, parser, indexedCollection) - println("Filtering logs") val filterResult = measureTimedValue { parser.retrieve(indexedCollection, filterQuery) } @@ -119,7 +119,7 @@ fun registerAndAddIndex( addIndex(ReversedRadixTreeIndex.onAttribute(att)) parser.registerAttribute(att) } catch (e: Exception) { - // TODO: Make sure to log these exceptions somewhere so that we can analyse them + e.reportException() addGenericAttribute(key, value, parser) } } @@ -127,9 +127,10 @@ fun registerAndAddIndex( try { val att: ParameterizedAttribute> = ParameterizedAttribute(key, value.javaClass) addIndex(HashIndex.onAttribute(att)) - addIndex(NavigableIndex.onAttribute(att)) +// addIndex(NavigableIndex.onAttribute(att)) // TODO: break it to specific types parser.registerAttribute(att) } catch (e: Exception) { + e.reportException() addGenericAttribute(key, value, parser) } } diff --git a/src/main/kotlin/storage/Db.kt b/src/main/kotlin/storage/Db.kt index a9593ae..6d6858d 100644 --- a/src/main/kotlin/storage/Db.kt +++ b/src/main/kotlin/storage/Db.kt @@ -101,9 +101,6 @@ object Db { newCatalog.remove(it) } db.nameCatalogSave(newCatalog) - db.getAllNames().forEach { - println(it) - } db.commit() } diff --git a/src/main/kotlin/storage/serializer/ObjectSerializer.kt b/src/main/kotlin/storage/serializer/ObjectSerializer.kt index ee1bfb1..c95e9fc 100644 --- a/src/main/kotlin/storage/serializer/ObjectSerializer.kt +++ b/src/main/kotlin/storage/serializer/ObjectSerializer.kt @@ -6,7 +6,8 @@ import org.mapdb.DataOutput2 import org.mapdb.serializer.GroupSerializerObjectArray import java.io.* -class ObjectSerializer(val classLoader: ClassLoader = Thread.currentThread().contextClassLoader) : GroupSerializerObjectArray() { +class ObjectSerializer(val classLoader: ClassLoader = Thread.currentThread().contextClassLoader) : + GroupSerializerObjectArray() { override fun serialize(out: DataOutput2, value: T) { val out2 = ObjectOutputStream(out as OutputStream) diff --git a/src/main/kotlin/ui/components/BodyHeader.kt b/src/main/kotlin/ui/components/BodyHeader.kt index 3bf3afb..6133299 100644 --- a/src/main/kotlin/ui/components/BodyHeader.kt +++ b/src/main/kotlin/ui/components/BodyHeader.kt @@ -17,6 +17,8 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import processor.QUERY_PREFIX import ui.CustomTheme +import ui.components.dialogs.FilterFaqDialog +import ui.components.dialogs.SettingsDialog @Composable fun BodyHeader( diff --git a/src/main/kotlin/ui/components/BodyPanel.kt b/src/main/kotlin/ui/components/BodyPanel.kt index b3ebed3..0201691 100644 --- a/src/main/kotlin/ui/components/BodyPanel.kt +++ b/src/main/kotlin/ui/components/BodyPanel.kt @@ -20,7 +20,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import inputs.adb.CancelException import inputs.adb.LogCatErrors import inputs.adb.ddmlib.Devices import inputs.adb.logcatErrorString @@ -95,7 +94,7 @@ fun BodyPanel( if (isOpen) { val sessionInfo = processor.getSessionInfo(sessionId.orEmpty()) if (sessionInfo != null) { - ExportDialog(sessionInfo, logItems) { + ui.components.dialogs.ExportDialog(sessionInfo, logItems) { isOpen = false } } @@ -298,9 +297,5 @@ private fun fetchOldData( } private fun pauseProcessor(processor: MainProcessor) { - try { - processor.pause() - } catch (ex: CancelException) { - println(ex.message) - } + processor.pause() } diff --git a/src/main/kotlin/ui/components/NewSessionBox.kt b/src/main/kotlin/ui/components/NewSessionBox.kt index d9150de..08a00ac 100644 --- a/src/main/kotlin/ui/components/NewSessionBox.kt +++ b/src/main/kotlin/ui/components/NewSessionBox.kt @@ -21,6 +21,7 @@ import inputs.adb.ddmlib.Devices import models.DeviceDetails2 import models.SessionInfo import ui.CustomTheme +import ui.components.dialogs.StyledCustomVerticalDialog @OptIn(ExperimentalMaterialApi::class, ExperimentalComposeUiApi::class) @Composable diff --git a/src/main/kotlin/ui/components/SideNavigation.kt b/src/main/kotlin/ui/components/SideNavigation.kt index d74b2c8..f3a875a 100644 --- a/src/main/kotlin/ui/components/SideNavigation.kt +++ b/src/main/kotlin/ui/components/SideNavigation.kt @@ -1,6 +1,5 @@ package ui.components -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.material.Divider @@ -8,15 +7,12 @@ import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import inputs.adb.ddmlib.Devices import kotlinx.coroutines.launch import processor.MainProcessor import ui.CustomTheme -import utils.APP_NAME +import ui.components.common.AppLogo @Composable fun SideNavigation( @@ -82,13 +78,3 @@ private fun SideNavHeader(header: String) { style = CustomTheme.typography.headings.h3 ) } - -@Composable -fun AppLogo(modifier: Modifier = Modifier) { - Image( - painterResource("icons/logo.svg"), APP_NAME, - modifier, - colorFilter = ColorFilter.tint(CustomTheme.colors.highContrast), - contentScale = ContentScale.FillWidth - ) -} diff --git a/src/main/kotlin/ui/components/BasicComponents.kt b/src/main/kotlin/ui/components/common/BasicComponents.kt similarity index 78% rename from src/main/kotlin/ui/components/BasicComponents.kt rename to src/main/kotlin/ui/components/common/BasicComponents.kt index 5ad5006..354b56d 100644 --- a/src/main/kotlin/ui/components/BasicComponents.kt +++ b/src/main/kotlin/ui/components/common/BasicComponents.kt @@ -1,25 +1,38 @@ -package ui.components +package ui.components.common +import androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.* import androidx.compose.foundation.text.ClickableText -import androidx.compose.material.Icon -import androidx.compose.material.RadioButton -import androidx.compose.material.Switch -import androidx.compose.material.Text +import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import models.MarkupText +import models.SocialIcons import ui.CustomTheme +import ui.components.dialogs.openBrowser import ui.views.DarkToggleButton +@Composable +fun AppLogo(modifier: Modifier = Modifier) { + Image( + painterResource("icons/logo.svg"), CustomTheme.strings.appName, + modifier, + colorFilter = ColorFilter.tint(CustomTheme.colors.highContrast), + contentScale = ContentScale.FillWidth + ) +} + @Composable fun DarkModeSwitchItem( isDarkMode: Boolean, @@ -181,3 +194,32 @@ fun MultiLineRadioButton( } } } + +@Composable +fun WebLinkButton( + socialIcons: SocialIcons, text: String, modifier: Modifier = Modifier +) { + val buttonColors = ButtonDefaults.textButtonColors( + contentColor = CustomTheme.colors.mediumContrast + ) + TextButton({ openBrowser(socialIcons.url) }, modifier, colors = buttonColors) { + Icon(painterResource(socialIcons.icon), socialIcons.name) + Spacer(Modifier.width(4.dp)) + Text(text, style = CustomTheme.typography.bodySmall) + } +} + +@Composable +fun WebLinkButtonFilled( + socialIcons: SocialIcons, text: String, modifier: Modifier = Modifier +) { + val buttonColors = ButtonDefaults.buttonColors( + backgroundColor = CustomTheme.colors.mediumContrast + ) + val elevation = ButtonDefaults.elevation(defaultElevation = 0.dp) + Button({ openBrowser(socialIcons.url) }, modifier, colors = buttonColors, elevation = elevation) { + Icon(painterResource(socialIcons.icon), socialIcons.name) + Spacer(Modifier.width(4.dp)) + Text(text, style = CustomTheme.typography.bodySmall) + } +} diff --git a/src/main/kotlin/ui/components/dialogs/CrashDialog.kt b/src/main/kotlin/ui/components/dialogs/CrashDialog.kt new file mode 100644 index 0000000..853cc20 --- /dev/null +++ b/src/main/kotlin/ui/components/dialogs/CrashDialog.kt @@ -0,0 +1,34 @@ +package ui.components.dialogs + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import models.SocialIcons +import ui.CustomTheme +import ui.components.common.WebLinkButtonFilled +import utils.CustomExceptionHandler + +@Composable +fun CrashDialog(onDismissRequest: () -> Unit) { + CustomExceptionHandler.setLastCrashConsumed() + SimpleVerticalDialog("Share crash", onDismissRequest) { + Image( + painterResource("icons/crash_illustration.xml"), "Crashed", + Modifier.fillMaxWidth(0.9f), contentScale = ContentScale.FillWidth + ) + Spacer(Modifier.height(16.dp)) + Text(CustomTheme.strings.appCrashText, textAlign = TextAlign.Center, style = CustomTheme.typography.body) + Spacer(Modifier.height(16.dp)) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(16.dp)) { + WebLinkButtonFilled(SocialIcons.GithubIssues, "Github Issue", Modifier.weight(0.5f)) + WebLinkButtonFilled(SocialIcons.Email, "Mail Us", Modifier.weight(0.5f)) + } + + } +} \ No newline at end of file diff --git a/src/main/kotlin/ui/components/CustomDialog.kt b/src/main/kotlin/ui/components/dialogs/CustomDialog.kt similarity index 98% rename from src/main/kotlin/ui/components/CustomDialog.kt rename to src/main/kotlin/ui/components/dialogs/CustomDialog.kt index 335577a..f84a189 100644 --- a/src/main/kotlin/ui/components/CustomDialog.kt +++ b/src/main/kotlin/ui/components/dialogs/CustomDialog.kt @@ -1,4 +1,4 @@ -package ui.components +package ui.components.dialogs import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -91,7 +91,7 @@ fun CustomDialog( Floats.constrainToRange(backgroundAlpha, 0.0f, 1.0f) Floats.constrainToRange(dialogWidthRatio, 0.1f, 1.0f) Floats.constrainToRange(dialogHeightRatio, 0.1f, 1.0f) - with(UndecoratedWindowAlertDialogProvider) { + with(PopupAlertDialogProvider) { AlertDialog(onDismissRequest) { Dialog( onCloseRequest = onDismissRequest, diff --git a/src/main/kotlin/ui/components/ExportDialog.kt b/src/main/kotlin/ui/components/dialogs/ExportDialog.kt similarity index 97% rename from src/main/kotlin/ui/components/ExportDialog.kt rename to src/main/kotlin/ui/components/dialogs/ExportDialog.kt index 3ed60f7..2e167e0 100644 --- a/src/main/kotlin/ui/components/ExportDialog.kt +++ b/src/main/kotlin/ui/components/dialogs/ExportDialog.kt @@ -1,4 +1,4 @@ -package ui.components +package ui.components.dialogs import androidx.compose.foundation.layout.* import androidx.compose.material.Button @@ -15,6 +15,8 @@ import kotlinx.coroutines.launch import models.* import processor.Exporter import storage.Db +import ui.components.common.MultiLineRadioButton +import ui.components.common.SwitchItem import utils.Helpers import java.nio.file.Path import kotlin.io.path.absolutePathString diff --git a/src/main/kotlin/ui/components/FaqDialog.kt b/src/main/kotlin/ui/components/dialogs/FaqDialog.kt similarity index 97% rename from src/main/kotlin/ui/components/FaqDialog.kt rename to src/main/kotlin/ui/components/dialogs/FaqDialog.kt index 10382dd..664ebf2 100644 --- a/src/main/kotlin/ui/components/FaqDialog.kt +++ b/src/main/kotlin/ui/components/dialogs/FaqDialog.kt @@ -1,4 +1,4 @@ -package ui.components +package ui.components.dialogs import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -13,6 +13,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import models.Faq import ui.CustomTheme +import ui.components.common.SimpleListItem @Composable fun FaqDialog( diff --git a/src/main/kotlin/ui/components/FileDialog.kt b/src/main/kotlin/ui/components/dialogs/FileDialog.kt similarity index 97% rename from src/main/kotlin/ui/components/FileDialog.kt rename to src/main/kotlin/ui/components/dialogs/FileDialog.kt index 7020ddd..f8f5227 100644 --- a/src/main/kotlin/ui/components/FileDialog.kt +++ b/src/main/kotlin/ui/components/dialogs/FileDialog.kt @@ -1,4 +1,4 @@ -package ui.components +package ui.components.dialogs import androidx.compose.runtime.Composable import androidx.compose.ui.window.AwtWindow diff --git a/src/main/kotlin/ui/components/IntroDialog.kt b/src/main/kotlin/ui/components/dialogs/IntroDialog.kt similarity index 97% rename from src/main/kotlin/ui/components/IntroDialog.kt rename to src/main/kotlin/ui/components/dialogs/IntroDialog.kt index bc9465a..05e0b51 100644 --- a/src/main/kotlin/ui/components/IntroDialog.kt +++ b/src/main/kotlin/ui/components/dialogs/IntroDialog.kt @@ -1,4 +1,4 @@ -package ui.components +package ui.components.dialogs import androidx.compose.foundation.background import androidx.compose.foundation.layout.* @@ -13,6 +13,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import ui.CustomTheme +import ui.components.common.AppLogo @Composable fun IntroDialog(onDismissRequest: () -> Unit) { diff --git a/src/main/kotlin/ui/components/SettingsDialog.kt b/src/main/kotlin/ui/components/dialogs/SettingsDialog.kt similarity index 89% rename from src/main/kotlin/ui/components/SettingsDialog.kt rename to src/main/kotlin/ui/components/dialogs/SettingsDialog.kt index 3f58af5..ea6a8ce 100644 --- a/src/main/kotlin/ui/components/SettingsDialog.kt +++ b/src/main/kotlin/ui/components/dialogs/SettingsDialog.kt @@ -1,7 +1,9 @@ -package ui.components +package ui.components.dialogs import androidx.compose.foundation.layout.* -import androidx.compose.material.* +import androidx.compose.material.Divider +import androidx.compose.material.Icon +import androidx.compose.material.IconButton import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -14,12 +16,13 @@ import androidx.compose.ui.text.withStyle import androidx.compose.ui.unit.dp import models.SocialIcons import ui.CustomTheme +import ui.components.ItemHeader +import ui.components.common.* import utils.AppSettings import utils.Helpers @Composable fun SettingsDialog(onDismissRequest: () -> Unit) { - SimpleVerticalDialog(header = "Settings", onDismissRequest = onDismissRequest) { GeneralSettingBlock(Modifier.fillMaxWidth()) Spacer(Modifier.height(16.dp)) @@ -103,7 +106,6 @@ fun OtherSettingBlock(modifier: Modifier = Modifier) { } Row(Modifier.padding(start = 32.dp)) { SocialIcons.DefaultIcons.forEach { - println(it) SocialIcon(it) } } @@ -111,16 +113,6 @@ fun OtherSettingBlock(modifier: Modifier = Modifier) { } } -@Composable -private fun WebLinkButton(socialIcons: SocialIcons, text: String) { - val buttonColors = ButtonDefaults.textButtonColors(contentColor = CustomTheme.colors.mediumContrast) - TextButton({ openBrowser(socialIcons.url) }, colors = buttonColors) { - Icon(painterResource(socialIcons.icon), socialIcons.name) - Spacer(Modifier.width(4.dp)) - Text(text, style = CustomTheme.typography.bodySmall) - } -} - @Composable private fun SocialIcon(icon: SocialIcons) { IconButton({ openBrowser(icon.url) }) { diff --git a/src/main/kotlin/utils/AppLog.kt b/src/main/kotlin/utils/AppLog.kt index b074c05..3a400df 100644 --- a/src/main/kotlin/utils/AppLog.kt +++ b/src/main/kotlin/utils/AppLog.kt @@ -1,5 +1,6 @@ package utils +import io.sentry.Sentry import java.util.logging.Level import java.util.logging.LogRecord import java.util.logging.SimpleFormatter @@ -17,3 +18,11 @@ object AppLog { d("Debug", msg) } } + +fun Throwable?.reportException() { + if (this == null) { + Sentry.captureException(UnsupportedOperationException("Throwable should not be null")) + return + } + Sentry.captureException(this) +} diff --git a/src/main/kotlin/utils/AppResources.kt b/src/main/kotlin/utils/AppResources.kt index 2e821cd..68439ca 100644 --- a/src/main/kotlin/utils/AppResources.kt +++ b/src/main/kotlin/utils/AppResources.kt @@ -1,15 +1,17 @@ package utils -const val APP_NAME = "LogVue" - //TODO: Move all strings here to support languages in future interface StringRes { val appName: String val filterFaqTitle: String + val appCrashText: String } class EnglishStringRes : StringRes { - override val appName: String = APP_NAME + override val appName: String = "LogVue" override val filterFaqTitle: String = "Filter FAQโ€™s" + override val appCrashText: String = "Unfortunately the app was crashed last time. " + + "While we look into this, you can also report this issue to us on github or through " + + "mail describing the scenario that caused this crash." } diff --git a/src/main/kotlin/utils/CustomExceptionHandler.kt b/src/main/kotlin/utils/CustomExceptionHandler.kt new file mode 100644 index 0000000..5762ff2 --- /dev/null +++ b/src/main/kotlin/utils/CustomExceptionHandler.kt @@ -0,0 +1,23 @@ +package utils + +class CustomExceptionHandler : Thread.UncaughtExceptionHandler { + + override fun uncaughtException(t: Thread?, e: Throwable?) { + e?.printStackTrace() + setCrashed() + } + + companion object { + private const val DB_KEY = "lastTimeException" + + private fun setCrashed() { + AppSettings.setFlag(DB_KEY, true) + } + + fun setLastCrashConsumed() { + AppSettings.setFlag(DB_KEY, false) + } + + fun isLastTimeCrashed() = AppSettings.getFlag(DB_KEY) + } +} \ No newline at end of file diff --git a/src/main/kotlin/utils/Helpers.kt b/src/main/kotlin/utils/Helpers.kt index 22a7a01..0bae37f 100644 --- a/src/main/kotlin/utils/Helpers.kt +++ b/src/main/kotlin/utils/Helpers.kt @@ -191,7 +191,7 @@ object Helpers { val dump = Dump(settings) dump.dumpToString(properties) } catch (e: Exception) { - AppLog.d("YamlConverter", e.localizedMessage) + e.reportException() null } } @@ -222,7 +222,7 @@ object Helpers { val dump = Dump(settings) dump.dump(properties, YamlWriter(printWriter)) } catch (e: Exception) { - AppLog.d("YamlConverter", e.localizedMessage) + e.reportException() } } @@ -231,7 +231,7 @@ object Helpers { val dump = Dump(settings) dump.dump(properties, streamDataWriter) } catch (e: Exception) { - AppLog.d("YamlConverter", e.localizedMessage) + e.reportException() } } @@ -292,7 +292,7 @@ object Helpers { } Runtime.getRuntime().exec(command) } catch (e: Exception) { - AppLog.d("failed to open file manager") + e.reportException() } } diff --git a/src/main/kotlin/utils/ItemObjectMapper.kt b/src/main/kotlin/utils/ItemObjectMapper.kt index 3516366..2c83af3 100644 --- a/src/main/kotlin/utils/ItemObjectMapper.kt +++ b/src/main/kotlin/utils/ItemObjectMapper.kt @@ -22,8 +22,7 @@ class ItemObjectMapper { } } } catch (e: Exception) { - LOGGER.error("Unexpected exception!", e) - println("Unexpected Exception! (item=$item e = ${e.message}") + Exception("Item mapping failed for item=$item", e).reportException() item.stringRepresentation } } @@ -31,7 +30,6 @@ class ItemObjectMapper { private fun parseObject(item: ObjectItem): HashMap { val map = hashMapOf() item.getAttributes().forEach { entry -> -// println("parsing for field: $entry") val stringRepresentation = entry.value.stringRepresentation ?: "" val key = entry.key.removePrefix("{").removeSuffix("}") diff --git a/src/main/kotlin/utils/SentryHelper.kt b/src/main/kotlin/utils/SentryHelper.kt new file mode 100644 index 0000000..a3736bf --- /dev/null +++ b/src/main/kotlin/utils/SentryHelper.kt @@ -0,0 +1,33 @@ +package utils + +import com.voxfinite.logvue.APP_VERSION +import io.sentry.Breadcrumb +import io.sentry.Sentry +import io.sentry.SentryOptions + +object SentryHelper { + + private const val SAMPLE_RATE = 0.3 + + fun init() { + Sentry.init { options: SentryOptions -> + options.dsn = System.getProperty("SENTRY_ENDPOINT").orEmpty() + // Set tracesSampleRate to 1.0 to capture 100% of transactions for performance monitoring. + // We recommend adjusting this value in production. + options.tracesSampleRate = SAMPLE_RATE + // When first trying Sentry it's good to see what the SDK is doing: + options.setDebug(System.getProperty("SENTRY_DEBUG").toBoolean()) + } + Sentry.configureScope { scope -> + scope.setTag("os.name", System.getProperty("os.name")) + scope.setTag("os.arch", System.getProperty("os.arch")) + scope.setTag("os.version", System.getProperty("os.version")) + scope.setTag("build.version", APP_VERSION) + } + } + + fun breadcrumb(breadcrumb: Breadcrumb) { + Sentry.addBreadcrumb(breadcrumb) + } + +} \ No newline at end of file diff --git a/src/main/resources/icons/crash_illustration.xml b/src/main/resources/icons/crash_illustration.xml new file mode 100644 index 0000000..034bea8 --- /dev/null +++ b/src/main/resources/icons/crash_illustration.xml @@ -0,0 +1,528 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index f6fa73b..5db49b8 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -1,14 +1,14 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file