diff --git a/.circleci/config.yml b/.circleci/config.yml index 7eb98b33..cad32112 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -35,7 +35,7 @@ jobs: command: ./gradlew dependencies --no-daemon --stacktrace --console=plain -PdisablePreDex || true - run: name: Initial build - command: ./gradlew build -x test -x lint -x fabricGenerateResourcesRelease -x packageRelease --no-daemon --stacktrace --console=plain -PdisablePreDex + command: ./gradlew build -x test -x lint -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease -x packageRelease --no-daemon --stacktrace --console=plain -PdisablePreDex - run: name: Run FOSSA command: fossa --no-ansi || true @@ -56,7 +56,7 @@ jobs: <<: *general_cache_key - run: name: Run lint - command: ./gradlew lint -x fabricGenerateResourcesRelease --no-daemon --stacktrace --console=plain -PdisablePreDex + command: ./gradlew lint -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex - store_artifacts: path: ./app/build/reports/ destination: lint_reports/app/ @@ -75,7 +75,7 @@ jobs: <<: *general_cache_key - run: name: Run app tests - command: ./gradlew :app:test :app:jacocoTestReport -x fabricGenerateResourcesRelease --no-daemon --stacktrace --console=plain -PdisablePreDex + command: ./gradlew :app:test :app:jacocoTestReport -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease --no-daemon --stacktrace --console=plain -PdisablePreDex - run: name: Upload unit code coverage to codecov command: bash <(curl -s https://codecov.io/bash) -F app @@ -116,7 +116,7 @@ jobs: adb shell input keyevent 82 - run: name: Run instrumented tests - command: ./gradlew clean createDebugCoverageReport jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex + command: ./gradlew clean createPlayDebugCoverageReport jacocoTestReport --no-daemon --stacktrace --console=plain -PdisablePreDex - run: name: Collect logs from emulator command: adb logcat -d > ./app/build/reports/logcat_emulator.txt @@ -162,7 +162,7 @@ jobs: openssl aes-256-cbc -d -in ./app/upload-key-encrypted.jks -k $ENCRYPT_KEY >> ./app/upload-key.jks - run: name: Publish release - command: ./gradlew publish --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex + command: ./gradlew publishPlayRelease --no-daemon --stacktrace --console=plain -PenableCrashlytics -PdisablePreDex workflows: version: 2 diff --git a/.gitignore b/.gitignore index 6bc531b6..63783326 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,4 @@ app/key.p12 app/upload-key.jks *.log .idea/assetWizardSettings.xml +.idea/uiDesigner.xml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0d1bcd5d..a84ac839 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -12,7 +12,7 @@ build: script: - ./gradlew --no-daemon --stacktrace dependencies || true - ./gradlew --no-daemon --stacktrace assembleDebug - - mv app/build/outputs/apk/debug/app-debug.apk . + - mv app/build/outputs/apk/fdroid/debug/app-fdroid-debug.apk . artifacts: name: "${CI_PROJECT_NAME}_${CI_BUILD_REF_NAME}-${CI_BUILD_ID}" paths: @@ -26,7 +26,7 @@ tests: - .gradle policy: pull script: - - ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesRelease test + - ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease test artifacts: paths: - app/build/reports/tests @@ -39,7 +39,7 @@ lint: - .gradle policy: pull script: - - ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesRelease lint + - ./gradlew --no-daemon --stacktrace -x fabricGenerateResourcesFdroidRelease -x fabricGenerateResourcesPlayRelease lint artifacts: paths: - app/build/reports diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d..00000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 56b6395a..863e23e6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,20 +47,20 @@ before_script: script: - ./gradlew dependencies --stacktrace --daemon - fossa --no-ansi || true - #- ./gradlew lint -x fabricGenerateResourcesRelease --stacktrace --daemon - - ./gradlew test -x fabricGenerateResourcesRelease --stacktrace --daemon - - ./gradlew createDebugCoverageReport --stacktrace --daemon + #- ./gradlew lintPlayRelease -x fabricGenerateResourcesPlayRelease --stacktrace --daemon + - ./gradlew testPlayDebugUnitTest -x fabricGenerateResourcesPlay --stacktrace --daemon + - ./gradlew createPlayDebugCoverageReport --stacktrace --daemon - ./gradlew jacocoTestReport --stacktrace --daemon - if [ -z ${SONAR_HOST+x} ]; then echo "sonar scan skipped"; else git fetch --unshallow; - ./gradlew sonarqube -x test -x lint -x fabricGenerateResourcesRelease -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} --stacktrace --daemon; + ./gradlew sonarqube -x test -x lint -x fabricGenerateResourcesPlayRelease -x fabricGenerateResourcesFdroidRelease -Dsonar.host.url=$SONAR_HOST -Dsonar.organization=$SONAR_ORG -Dsonar.login=$SONAR_KEY -Dsonar.branch.name=${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH} --stacktrace --daemon; fi - | if [ $TRAVIS_TAG ]; then gpg --yes --batch --passphrase=$SERVICES_ENCRYPT_KEY ./app/src/release/google-services.json.gpg; gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/key.p12.gpg; gpg --yes --batch --passphrase=$ENCRYPT_KEY ./app/upload-key.jks.gpg; - ./gradlew publish -PenableCrashlytics --stacktrace; + ./gradlew publishPlayRelease -PenableCrashlytics --stacktrace; fi after_success: diff --git a/README.md b/README.md index 97a4172c..07f06d7f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # Wulkanowy -[![CircleCI](https://img.shields.io/circleci/project/github/wulkanowy/wulkanowy/master.svg?style=flat-square)](https://circleci.com/gh/wulkanowy/wulkanowy) [![Travis](https://img.shields.io/travis/com/wulkanowy/wulkanowy/master.svg?style=flat-square)](https://travis-ci.com/wulkanowy/wulkanowy) [![Bitrise](https://img.shields.io/bitrise/daeff1893f3c8128/master.svg?token=Hjm1ACamk86JDeVVJHOeqQ&style=flat-square)](https://www.bitrise.io/app/daeff1893f3c8128) [![Codecov](https://img.shields.io/codecov/c/github/wulkanowy/wulkanowy/master.svg?style=flat-square)](https://codecov.io/gh/wulkanowy/wulkanowy) @@ -8,6 +7,8 @@ [![Sonarcloud](https://sonarcloud.io/api/project_badges/measure?project=io.github.wulkanowy%3Aapp&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=io.github.wulkanowy%3Aapp) [![FOSSA Status](https://app.fossa.com/api/projects/custom%2B5644%2Fgithub.com%2Fwulkanowy%2Fwulkanowy.svg?type=shield)](https://app.fossa.com/projects/custom%2B5644%2Fgithub.com%2Fwulkanowy%2Fwulkanowy?ref=badge_shield) [![Discord](https://img.shields.io/discord/390889354199040011.svg?style=flat-square)](https://discord.gg/vccAQBr) +[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg)](https://f-droid.org/packages/io.github.wulkanowy/) +[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github)](https://github.com/wulkanowy/wulkanowy/releases) [Pobierz wersjÄ™ beta z Google Play](https://play.google.com/store/apps/details?id=io.github.wulkanowy&utm_source=vcs) diff --git a/app/build.gradle b/app/build.gradle index f0a00354..2a7bf891 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -63,6 +63,18 @@ android { } } + flavorDimensions "platform" + productFlavors { + play { + dimension "platform" + } + + fdroid { + buildConfigField "boolean", "CRASHLYTICS_ENABLED", "false" + dimension "platform" + } + } + lintOptions { disable 'HardwareIds' } @@ -129,8 +141,8 @@ dependencies { implementation "com.mikepenz:aboutlibraries:6.2.3" implementation 'com.takisoft.preferencex:preferencex:1.0.0' - implementation 'com.google.firebase:firebase-core:16.0.9' - implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' + playImplementation 'com.google.firebase:firebase-core:16.0.9' + playImplementation 'com.crashlytics.sdk.android:crashlytics:2.10.1' releaseImplementation 'fr.o80.chucker:library-no-op:2.0.4' diff --git a/app/jacoco.gradle b/app/jacoco.gradle index f22c3359..44cd3f62 100644 --- a/app/jacoco.gradle +++ b/app/jacoco.gradle @@ -35,11 +35,14 @@ task jacocoTestReport(type: JacocoReport) { dir: "$buildDir/intermediates/classes/debug", excludes: excludes ) + fileTree( - dir: "$buildDir/tmp/kotlin-classes/debug", + dir: "$buildDir/tmp/kotlin-classes/playDebug", excludes: excludes )) - sourceDirectories.setFrom(files("$project.projectDir/src/main/java")) + sourceDirectories.setFrom(files([ + "src/main/java", + "src/play/java" + ])) executionData.setFrom(fileTree( dir: project.projectDir, includes: ["**/*.exec", "**/*.ec"] diff --git a/app/sonarqube.gradle b/app/sonarqube.gradle index 52fd2dd8..3dad1034 100644 --- a/app/sonarqube.gradle +++ b/app/sonarqube.gradle @@ -29,5 +29,6 @@ sonarqube { property "sonar.java.coveragePlugin", "jacoco" property "sonar.android.lint.report", "build/reports/lint-results.xml" property "sonar.jacoco.reportPaths", fileTree(dir: project.projectDir, includes: ['**/*.exec', '**/*.ec']) + property "sonar.coverage.jacoco.xmlReportPaths", "build/reports/jacocoTestReport/jacocoTestReport.xml" } } diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt new file mode 100644 index 00000000..33ef5a58 --- /dev/null +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -0,0 +1,17 @@ +@file:Suppress("UNUSED_PARAMETER") + +package io.github.wulkanowy.utils + +import android.content.Context +import timber.log.Timber + +class CrashlyticsTree : Timber.Tree() { + + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + // do nothing + } +} + +fun initCrashlytics(context: Context) { + // do nothing +} diff --git a/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt b/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt new file mode 100644 index 00000000..0b1274f1 --- /dev/null +++ b/app/src/fdroid/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt @@ -0,0 +1,13 @@ +package io.github.wulkanowy.utils + +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class FirebaseAnalyticsHelper @Inject constructor() { + + @Suppress("UNUSED_PARAMETER") + fun logEvent(name: String, vararg params: Pair) { + // do nothing + } +} diff --git a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt index a58a9804..35a0e8da 100644 --- a/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt +++ b/app/src/main/java/io/github/wulkanowy/WulkanowyApp.kt @@ -4,21 +4,18 @@ import android.content.Context import androidx.multidex.MultiDex import androidx.work.Configuration import androidx.work.WorkManager -import com.crashlytics.android.Crashlytics -import com.crashlytics.android.core.CrashlyticsCore import com.jakewharton.threetenabp.AndroidThreeTen import dagger.android.AndroidInjector import dagger.android.support.DaggerApplication import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.utils.Log -import io.fabric.sdk.android.Fabric -import io.github.wulkanowy.BuildConfig.CRASHLYTICS_ENABLED import io.github.wulkanowy.BuildConfig.DEBUG import io.github.wulkanowy.di.DaggerAppComponent import io.github.wulkanowy.services.sync.SyncWorkerFactory import io.github.wulkanowy.utils.ActivityLifecycleLogger import io.github.wulkanowy.utils.CrashlyticsTree import io.github.wulkanowy.utils.DebugLogTree +import io.github.wulkanowy.utils.initCrashlytics import io.reactivex.exceptions.UndeliverableException import io.reactivex.plugins.RxJavaPlugins import timber.log.Timber @@ -41,7 +38,7 @@ class WulkanowyApp : DaggerApplication() { WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(workerFactory).build()) RxJavaPlugins.setErrorHandler(::onError) - initCrashlytics() + initCrashlytics(applicationContext) initLogging() } @@ -55,12 +52,6 @@ class WulkanowyApp : DaggerApplication() { registerActivityLifecycleCallbacks(ActivityLifecycleLogger()) } - private fun initCrashlytics() { - Fabric.with(Fabric.Builder(this).kits( - Crashlytics.Builder().core(CrashlyticsCore.Builder().disabled(!CRASHLYTICS_ENABLED).build()).build() - ).debuggable(DEBUG).build()) - } - private fun onError(error: Throwable) { if (error is UndeliverableException && error.cause is IOException || error.cause is InterruptedException) { Timber.e(error.cause, "An undeliverable error occurred") diff --git a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt index da1d8f7a..9ea2bf10 100644 --- a/app/src/main/java/io/github/wulkanowy/di/AppModule.kt +++ b/app/src/main/java/io/github/wulkanowy/di/AppModule.kt @@ -2,7 +2,6 @@ package io.github.wulkanowy.di import android.appwidget.AppWidgetManager import android.content.Context -import com.google.firebase.analytics.FirebaseAnalytics import dagger.Module import dagger.Provides import eu.davidea.flexibleadapter.FlexibleAdapter @@ -27,10 +26,6 @@ internal class AppModule { @Provides fun provideFlexibleAdapter() = FlexibleAdapter>(null, null, true) - @Singleton - @Provides - fun provideFirebaseAnalytics(context: Context) = FirebaseAnalytics.getInstance(context) - @Singleton @Provides fun provideAppWidgetManager(context: Context): AppWidgetManager = AppWidgetManager.getInstance(context) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt index e3338dbe..5e7333e1 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.attendance -import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.repositories.attendance.AttendanceRepository import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository @@ -9,12 +8,7 @@ import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.ErrorHandler import io.github.wulkanowy.utils.FirebaseAnalyticsHelper -import io.github.wulkanowy.utils.SchedulersProvider -import io.github.wulkanowy.utils.isHolidays -import io.github.wulkanowy.utils.nextSchoolDay -import io.github.wulkanowy.utils.previousOrSameSchoolDay -import io.github.wulkanowy.utils.previousSchoolDay -import io.github.wulkanowy.utils.toFormattedString +import io.github.wulkanowy.utils.* import org.threeten.bp.LocalDate import org.threeten.bp.LocalDate.now import org.threeten.bp.LocalDate.ofEpochDay @@ -115,7 +109,7 @@ class AttendancePresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) } - analytics.logEvent("load_attendance", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")) + analytics.logEvent("load_attendance", "items" to it.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading attendance result: An exception occurred") view?.run { showEmpty(isViewEmpty) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt index 0acdafd0..4045a956 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.exam -import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Exam import io.github.wulkanowy.data.repositories.exam.ExamRepository @@ -102,7 +101,7 @@ class ExamPresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) } - analytics.logEvent("load_exam", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")) + analytics.logEvent("load_exam", "items" to it.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading exam result: An exception occurred") view?.run { showEmpty(isViewEmpty) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt index 4b8fdee0..682e87d4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/HomeworkPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.homework -import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Homework import io.github.wulkanowy.data.repositories.homework.HomeworkRepository @@ -89,7 +88,7 @@ class HomeworkPresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) } - analytics.logEvent("load_homework", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")) + analytics.logEvent("load_homework", "items" to it.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading homework result: An exception occurred") view?.run { showEmpty(isViewEmpty()) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt index 77e5aa3f..0fbfb329 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/form/LoginFormPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.login.form -import com.google.firebase.analytics.FirebaseAnalytics.Param.SUCCESS import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -78,11 +77,11 @@ class LoginFormPresenter @Inject constructor( } .subscribe({ Timber.i("Login result: Success") - analytics.logEvent("registration_form", SUCCESS to true, "students" to it.size, "endpoint" to endpoint, "error" to "No error") + analytics.logEvent("registration_form", "success" to true, "students" to it.size, "endpoint" to endpoint, "error" to "No error") view?.notifyParentAccountLogged(it) }, { Timber.i("Login result: An exception occurred") - analytics.logEvent("registration_form", SUCCESS to false, "students" to -1, "endpoint" to endpoint, "error" to it.localizedMessage) + analytics.logEvent("registration_form", "success" to false, "students" to -1, "endpoint" to endpoint, "error" to it.localizedMessage.ifEmpty { "No message" }) loginErrorHandler.dispatch(it) })) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt index 29c90f30..0636e163 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.login.studentselect -import com.google.firebase.analytics.FirebaseAnalytics.Param.SUCCESS import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.db.entities.Student import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -21,7 +20,7 @@ class LoginStudentSelectPresenter @Inject constructor( var students = emptyList() - var selectedStudents = mutableListOf() + private var selectedStudents = mutableListOf() fun onAttachView(view: LoginStudentSelectView, students: Serializable?) { super.onAttachView(view) @@ -78,11 +77,11 @@ class LoginStudentSelectPresenter @Inject constructor( Timber.i("Registration started") } .subscribe({ - students.forEach { analytics.logEvent("registration_student_select", SUCCESS to true, "endpoint" to it.endpoint, "symbol" to it.symbol, "error" to "No error") } + students.forEach { analytics.logEvent("registration_student_select", "success" to true, "endpoint" to it.endpoint, "symbol" to it.symbol, "error" to "No error") } Timber.i("Registration result: Success") view?.openMainView() }, { error -> - students.forEach { analytics.logEvent("registration_student_select", SUCCESS to false, "endpoint" to it.endpoint, "symbol" to it.symbol, "error" to error.localizedMessage) } + students.forEach { analytics.logEvent("registration_student_select", "success" to false, "endpoint" to it.endpoint, "symbol" to it.symbol, "error" to error.localizedMessage.ifEmpty { "No message" }) } Timber.i("Registration result: An exception occurred ") loginErrorHandler.dispatch(error) view?.apply { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt index 3bf0d8f2..8776526e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.login.symbol -import com.google.firebase.analytics.FirebaseAnalytics.Param.SUCCESS import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.modules.login.LoginErrorHandler @@ -59,7 +58,7 @@ class LoginSymbolPresenter @Inject constructor( } } .subscribe({ - analytics.logEvent("registration_symbol", SUCCESS to true, "students" to it.size, "endpoint" to loginData?.third, "symbol" to symbol, "error" to "No error") + analytics.logEvent("registration_symbol", "success" to true, "students" to it.size, "endpoint" to loginData?.third, "symbol" to symbol, "error" to "No error") view?.apply { if (it.isEmpty()) { Timber.i("Login with symbol result: Empty student list") @@ -71,7 +70,7 @@ class LoginSymbolPresenter @Inject constructor( } }, { Timber.i("Login with symbol result: An exception occurred") - analytics.logEvent("registration_symbol", SUCCESS to false, "students" to -1, "endpoint" to loginData?.third, "symbol" to symbol, "error" to it.localizedMessage) + analytics.logEvent("registration_symbol", "success" to false, "students" to -1, "endpoint" to loginData?.third, "symbol" to symbol, "error" to it.localizedMessage.ifEmpty { "No message" }) loginErrorHandler.dispatch(it) })) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 26ee4aff..a74226bf 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -1,7 +1,5 @@ package io.github.wulkanowy.ui.modules.main -import com.google.firebase.analytics.FirebaseAnalytics.Event.APP_OPEN -import com.google.firebase.analytics.FirebaseAnalytics.Param.DESTINATION import io.github.wulkanowy.data.repositories.preferences.PreferencesRepository import io.github.wulkanowy.data.repositories.student.StudentRepository import io.github.wulkanowy.services.sync.SyncManager @@ -33,7 +31,7 @@ class MainPresenter @Inject constructor( } syncManager.startSyncWorker() - analytics.logEvent(APP_OPEN, DESTINATION to initMenu?.name) + analytics.logEvent("app_open", "destination" to initMenu?.name) } fun onViewChange() { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt index e269eae7..a230c0b3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/message/preview/MessagePreviewPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.message.preview -import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE import io.github.wulkanowy.data.db.entities.Message import io.github.wulkanowy.data.repositories.message.MessageRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -53,7 +52,7 @@ class MessagePreviewPresenter @Inject constructor( else setSender(it.sender) } } - analytics.logEvent("load_message_preview", START_DATE to message.date.toFormattedString("yyyy.MM.dd"), "length" to message.content?.length) + analytics.logEvent("load_message_preview", "length" to message.content?.length) }) { Timber.i("Loading message $id preview result: An exception occurred ") view?.showMessageError() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt index 4445eed7..bead4228 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/TimetablePresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.timetable -import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.repositories.semester.SemesterRepository import io.github.wulkanowy.data.repositories.student.StudentRepository @@ -109,7 +108,7 @@ class TimetablePresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) } - analytics.logEvent("load_timetable", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")) + analytics.logEvent("load_timetable", "items" to it.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading timetable result: An exception occurred") view?.run { showEmpty(isViewEmpty) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt index 34399245..0db5210f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/timetable/completed/CompletedLessonsPresenter.kt @@ -1,6 +1,5 @@ package io.github.wulkanowy.ui.modules.timetable.completed -import com.google.firebase.analytics.FirebaseAnalytics.Param.START_DATE import eu.davidea.flexibleadapter.items.AbstractFlexibleItem import io.github.wulkanowy.data.repositories.completedlessons.CompletedLessonsRepository import io.github.wulkanowy.data.repositories.semester.SemesterRepository @@ -93,7 +92,7 @@ class CompletedLessonsPresenter @Inject constructor( showEmpty(it.isEmpty()) showContent(it.isNotEmpty()) } - analytics.logEvent("load_completed_lessons", "items" to it.size, "force_refresh" to forceRefresh, START_DATE to currentDate.toFormattedString("yyyy-MM-dd")) + analytics.logEvent("load_completed_lessons", "items" to it.size, "force_refresh" to forceRefresh) }) { Timber.i("Loading completed lessons result: An exception occurred") view?.run { showEmpty(isViewEmpty) } diff --git a/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt b/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt index 5a6cc2bf..f9db0465 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt +++ b/app/src/main/java/io/github/wulkanowy/utils/LoggerUtils.kt @@ -7,7 +7,6 @@ import android.os.Bundle import android.view.View import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import com.crashlytics.android.Crashlytics import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -19,17 +18,6 @@ class DebugLogTree : Timber.DebugTree() { } } -class CrashlyticsTree : Timber.Tree() { - - override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { - Crashlytics.setInt("priority", priority) - Crashlytics.setString("tag", tag) - - if (t == null) Crashlytics.log(message) - else Crashlytics.logException(t) - } -} - class ActivityLifecycleLogger : Application.ActivityLifecycleCallbacks { override fun onActivityPaused(activity: Activity?) { diff --git a/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt new file mode 100644 index 00000000..77c2f4a0 --- /dev/null +++ b/app/src/play/java/io/github/wulkanowy/utils/CrashlyticsUtils.kt @@ -0,0 +1,25 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import com.crashlytics.android.Crashlytics +import com.crashlytics.android.core.CrashlyticsCore +import io.fabric.sdk.android.Fabric +import io.github.wulkanowy.BuildConfig +import timber.log.Timber + +class CrashlyticsTree : Timber.Tree() { + + override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { + Crashlytics.setInt("priority", priority) + Crashlytics.setString("tag", tag) + + if (t == null) Crashlytics.log(message) + else Crashlytics.logException(t) + } +} + +fun initCrashlytics(context: Context) { + Fabric.with(Fabric.Builder(context).kits( + Crashlytics.Builder().core(CrashlyticsCore.Builder().disabled(!BuildConfig.CRASHLYTICS_ENABLED).build()).build() + ).debuggable(BuildConfig.DEBUG).build()) +} diff --git a/app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt b/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt similarity index 79% rename from app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt rename to app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt index e7ac9c99..6810e66a 100644 --- a/app/src/main/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt +++ b/app/src/play/java/io/github/wulkanowy/utils/FirebaseAnalyticsHelper.kt @@ -1,12 +1,15 @@ package io.github.wulkanowy.utils +import android.content.Context import android.os.Bundle import com.google.firebase.analytics.FirebaseAnalytics import javax.inject.Inject import javax.inject.Singleton @Singleton -class FirebaseAnalyticsHelper @Inject constructor(private val analytics: FirebaseAnalytics) { +class FirebaseAnalyticsHelper @Inject constructor(private val context: Context) { + + private val analytics by lazy { FirebaseAnalytics.getInstance(context) } fun logEvent(name: String, vararg params: Pair) { Bundle().apply {