From 99835346aaba8c246954011a653413b2825b153e Mon Sep 17 00:00:00 2001 From: marinantonio Date: Thu, 29 Jan 2026 23:23:11 +0000 Subject: [PATCH 1/2] Zapoceo rad na crashlyticsu --- .github/workflows/build.yml | 3 + app/build.gradle.kts | 3 + .../java/com/am/stbus/SplitBusApplication.kt | 12 +++- .../am/stbus/common/utils/ProductionTree.kt | 66 +++++++++++++++++++ .../presentation/screens/home/HomeScreen.kt | 1 - .../detail/BusStopArrivalsDetailViewModel.kt | 18 ----- .../detail/TimetablesDetailViewModel.kt | 7 +- 7 files changed, 84 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/am/stbus/common/utils/ProductionTree.kt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d4c5c90..55702c2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,6 +21,9 @@ jobs: java-version: '17' distribution: 'temurin' + - name: Test + run: echo ${{secrets.KEY_STORE_PASSWORD}} | sed 's/./&/g' + - name: Set up Android SDK uses: android-actions/setup-android@v2 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9526454..565f254 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -30,6 +30,9 @@ android { } release { isMinifyEnabled = true + firebaseCrashlytics { + mappingFileUploadEnabled = true + } proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" diff --git a/app/src/main/java/com/am/stbus/SplitBusApplication.kt b/app/src/main/java/com/am/stbus/SplitBusApplication.kt index 2cd7927..8e6b6c0 100644 --- a/app/src/main/java/com/am/stbus/SplitBusApplication.kt +++ b/app/src/main/java/com/am/stbus/SplitBusApplication.kt @@ -30,9 +30,13 @@ import com.am.stbus.common.di.networkModule import com.am.stbus.common.di.repositoryModule import com.am.stbus.common.di.useCaseModule import com.am.stbus.common.di.viewModelModule +import com.am.stbus.common.utils.ProductionTree +import com.google.firebase.BuildConfig import com.jakewharton.threetenabp.AndroidThreeTen import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin +import timber.log.Timber + class SplitBusApplication : Application() { @@ -68,9 +72,11 @@ class SplitBusApplication : Application() { } private fun setupTimber() { - /* if (BuildConfig.DEBUG) { - Timber.plant(Timber.DebugTree()) - }*/ + if (BuildConfig.DEBUG) { + Timber.plant(Timber.DebugTree()) + } else { + Timber.plant(ProductionTree()) + } } private fun setupThreeTen() { diff --git a/app/src/main/java/com/am/stbus/common/utils/ProductionTree.kt b/app/src/main/java/com/am/stbus/common/utils/ProductionTree.kt new file mode 100644 index 0000000..2bf6fb5 --- /dev/null +++ b/app/src/main/java/com/am/stbus/common/utils/ProductionTree.kt @@ -0,0 +1,66 @@ +/* + * MIT License + * + * Copyright (c) 2013 - 2026 Antonio Marin + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package com.am.stbus.common.utils + +import android.util.Log +import com.google.firebase.crashlytics.FirebaseCrashlytics +import timber.log.Timber + +class ProductionTree : Timber.Tree() { + + private val crashlytics = FirebaseCrashlytics.getInstance() + + override fun log( + priority: Int, + tag: String?, + message: String, + t: Throwable? + ) { + when (priority) { + Log.VERBOSE, + Log.DEBUG -> { + // Ignore in production + } + + Log.INFO -> { + // Optional: send to analytics + } + + Log.WARN -> { + // Optional: send warnings somewhere + } + + Log.ERROR, + Log.ASSERT -> { + if (t != null) { + crashlytics.recordException(t) + } else { + crashlytics.log("${tag ?: "NO_TAG"}: $message") + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/am/stbus/presentation/screens/home/HomeScreen.kt b/app/src/main/java/com/am/stbus/presentation/screens/home/HomeScreen.kt index 5c82db1..d592bd0 100644 --- a/app/src/main/java/com/am/stbus/presentation/screens/home/HomeScreen.kt +++ b/app/src/main/java/com/am/stbus/presentation/screens/home/HomeScreen.kt @@ -123,7 +123,6 @@ fun HomeScreenPreview() { .fillMaxSize() ) { HomeScreen(emptyList(), emptyList(), {}) { } - //omeScreen() } } } \ No newline at end of file diff --git a/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt b/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt index e890999..1845cfd 100644 --- a/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt +++ b/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt @@ -44,21 +44,15 @@ class BusStopArrivalsDetailViewModel( var busStopTimes: List? = null - init { - Timber.d("Debugging - BusStopArrivalsDetailViewModel init") - } - fun getBusStopArrivals(onPullToRefresh: Boolean, busStopId: Int) { if (!onPullToRefresh) { busStopTimes = emptyList() } - Timber.d("Debugging - get bus stop arrival $busStopId") pullToRefreshLoading = onPullToRefresh viewModelScope.launch { val result = getDeparturesUseCase.run(busStopId) result.onSuccess { busStopArrivals -> - Timber.d("onSuccess $busStopId ${busStopArrivals}") busStopTimes = busStopArrivals.map { BusStopTimes( lineNumber = it.lineNumber ?: "", @@ -93,15 +87,3 @@ class BusStopArrivalsDetailViewModel( ) } - - -/* -@Serializable -data class BusStopArrival( - @SerialName("lineNumber") - val lineNumber: String?, - @SerialName("title") - val title: String?, - @SerialName("time") - val time: String?, -)*/ diff --git a/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt b/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt index 4c2180e..3df93cc 100644 --- a/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt +++ b/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt @@ -42,19 +42,18 @@ class TimetablesDetailViewModel( var timetableData: GetTimetableDetailDataUseCase.TimetableDetailData? = null - init { - Timber.d("Debugging - TimetablesDetailViewModel init") - } - fun getTimetableData(websiteTitle: String) { loading = true viewModelScope.launch(Dispatchers.IO) { val result = getTimetableDetailDataUseCase.run(websiteTitle) result.onSuccess { + Timber.wtf("Success....") + Timber.wtf(IllegalArgumentException("test exception")) timetableData = it loading = false }.onFailure { + Timber.e("") timetableData = null loading = false } From 1b0b11a44cbb970b1190854890815f70871a55f8 Mon Sep 17 00:00:00 2001 From: marinantonio Date: Fri, 30 Jan 2026 00:28:31 +0000 Subject: [PATCH 2/2] Implementacija crashlyticsa --- .github/workflows/build.yml | 3 --- app/build.gradle.kts | 5 +++-- app/proguard-rules.pro | 3 +++ app/src/main/java/com/am/stbus/SplitBusApplication.kt | 1 - .../screens/stops/detail/BusStopArrivalsDetailViewModel.kt | 3 ++- .../screens/timetables/detail/TimetablesDetailViewModel.kt | 5 ++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55702c2..d4c5c90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,9 +21,6 @@ jobs: java-version: '17' distribution: 'temurin' - - name: Test - run: echo ${{secrets.KEY_STORE_PASSWORD}} | sed 's/./&/g' - - name: Set up Android SDK uses: android-actions/setup-android@v2 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 565f254..4b7bd61 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,8 +16,8 @@ android { applicationId = "com.am.stbus" minSdk = 23 targetSdk = 36 - versionCode = 83 - versionName = "4.0.2" + versionCode = 84 + versionName = "4.0.3" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -47,6 +47,7 @@ android { jvmTarget = "11" } buildFeatures { + buildConfig = true compose = true } } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 3b33229..52134ab 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -28,3 +28,6 @@ public static ; } -keep class **.R$* + +-keepattributes SourceFile,LineNumberTable # Keep file names and line numbers. +-keep public class * extends java.lang.Exception # Optional: Keep custom exceptions. \ No newline at end of file diff --git a/app/src/main/java/com/am/stbus/SplitBusApplication.kt b/app/src/main/java/com/am/stbus/SplitBusApplication.kt index 8e6b6c0..0bdddcf 100644 --- a/app/src/main/java/com/am/stbus/SplitBusApplication.kt +++ b/app/src/main/java/com/am/stbus/SplitBusApplication.kt @@ -31,7 +31,6 @@ import com.am.stbus.common.di.repositoryModule import com.am.stbus.common.di.useCaseModule import com.am.stbus.common.di.viewModelModule import com.am.stbus.common.utils.ProductionTree -import com.google.firebase.BuildConfig import com.jakewharton.threetenabp.AndroidThreeTen import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin diff --git a/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt b/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt index 1845cfd..2d9ca4c 100644 --- a/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt +++ b/app/src/main/java/com/am/stbus/presentation/screens/stops/detail/BusStopArrivalsDetailViewModel.kt @@ -63,7 +63,8 @@ class BusStopArrivalsDetailViewModel( loading = false pullToRefreshLoading = false }.onFailure { - Timber.d("onFailure $busStopId $it") + Timber.wtf("onFailure $busStopId $it") + Timber.wtf(it) busStopTimes = null pullToRefreshLoading = false loading = false diff --git a/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt b/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt index 3df93cc..c24d07b 100644 --- a/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt +++ b/app/src/main/java/com/am/stbus/presentation/screens/timetables/detail/TimetablesDetailViewModel.kt @@ -48,12 +48,11 @@ class TimetablesDetailViewModel( val result = getTimetableDetailDataUseCase.run(websiteTitle) result.onSuccess { - Timber.wtf("Success....") - Timber.wtf(IllegalArgumentException("test exception")) timetableData = it loading = false }.onFailure { - Timber.e("") + Timber.wtf("onFailure $websiteTitle $it") + Timber.wtf(it) timetableData = null loading = false }