Dep Updates and Analytics & Crashlytics Changed

This commit is contained in:
shabinder 2021-08-20 02:14:56 +05:30
parent ad94224d5c
commit 9d1e29b7e7
18 changed files with 290 additions and 146 deletions

View File

@ -14,7 +14,6 @@
* * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import Extras.Android.Acra
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
import org.jetbrains.compose.compose
@ -73,7 +72,6 @@ android {
}
}
kotlinOptions {
useIR = true
jvmTarget = "1.8"
}
compileOptions {
@ -123,10 +121,8 @@ dependencies {
// Extras
with(Extras.Android) {
implementation(Acra.notification)
implementation(Acra.http)
implementation(countly)
implementation(appUpdator)
implementation(matomo)
}
with(Versions.androidxLifecycle) {
@ -138,7 +134,7 @@ dependencies {
// implementation("com.jakewharton.timber:timber:4.7.1")
implementation("dev.icerock.moko:parcelize:${Versions.mokoParcelize}")
implementation("com.github.shabinder:storage-chooser:2.0.4.45")
implementation("com.google.accompanist:accompanist-insets:0.12.0")
implementation("com.google.accompanist:accompanist-insets:0.16.1")
// Test
testImplementation("junit:junit:4.13.2")

View File

@ -40,6 +40,8 @@
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:name=".App"
@ -73,5 +75,16 @@
</activity>
<service android:name=".service.ForegroundService"/>
<service android:name="org.openudid.OpenUDID_service">
<intent-filter>
<action android:name="org.openudid.GETUDID" />
</intent-filter>
</service>
<receiver android:name="ly.count.android.sdk.ReferrerReceiver" android:exported="true">
<intent-filter>
<action android:name="com.android.vending.INSTALL_REFERRER" />
</intent-filter>
</receiver>
</application>
</manifest>

View File

@ -17,22 +17,12 @@
package com.shabinder.spotiflyer
import android.app.Application
import android.content.Context
import com.shabinder.common.di.initKoin
import com.shabinder.common.translations.Strings
import com.shabinder.spotiflyer.di.appModule
import org.acra.config.httpSender
import org.acra.config.notification
import org.acra.data.StringFormat
import org.acra.ktx.initAcra
import org.acra.sender.HttpSender
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.component.KoinComponent
import org.koin.core.logger.Level
import org.matomo.sdk.Matomo
import org.matomo.sdk.Tracker
import org.matomo.sdk.TrackerBuilder
class App : Application(), KoinComponent {
@ -40,21 +30,6 @@ class App : Application(), KoinComponent {
const val SIGNATURE_HEX = "53304f6d75736a2f30484230334c454b714753525763724259444d3d0a"
}
val tracker: Tracker by lazy {
TrackerBuilder.createDefault(
"https://matomo.spotiflyer.ml/matomo.php", 1
)
.build(Matomo.getInstance(this)).apply {
if (BuildConfig.DEBUG) {
/*Timber.plant(DebugTree())
addTrackingCallback {
Timber.d(it.toMap().toString())
it
}*/
}
}
}
override fun onCreate() {
super.onCreate()
@ -66,35 +41,4 @@ class App : Application(), KoinComponent {
modules(appModule(loggingEnabled))
}
}
@Suppress("SpellCheckingInspection")
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
// Crashlytics
initAcra {
buildConfigClass = BuildConfig::class.java
reportFormat = StringFormat.JSON
/*
* Prompt User Before Sending Any Crash Report
* Obeying `F-Droid Inclusion Privacy Rules`
* */
notification {
title = Strings.acraNotificationTitle()
text = Strings.acraNotificationText()
channelName = "SpotiFlyer_Crashlytics"
channelDescription = "Notification Channel to send Spotiflyer Crashes."
sendOnClick = true
}
// Send Crash Report to self hosted Acrarium (FOSS)
httpSender {
uri = "https://acrarium.spotiflyer.ml/acrarium/report"
basicAuthLogin = "sDj2xCKQIxw0dujf"
basicAuthPassword = "O83du0TsgsDJ69zN"
httpMethod = HttpSender.Method.POST
connectionTimeout = 15000
socketTimeout = 20000
compress = true
}
}
}
}

View File

@ -17,12 +17,7 @@
package com.shabinder.spotiflyer
import android.annotation.SuppressLint
import android.content.ClipData
import android.content.ClipboardManager
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.content.*
import android.content.pm.PackageManager
import android.media.MediaScannerConnection
import android.net.Uri
@ -40,13 +35,7 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalView
import androidx.core.content.ContextCompat
@ -65,14 +54,11 @@ import com.google.accompanist.insets.statusBarsPadding
import com.shabinder.common.di.ConnectionLiveData
import com.shabinder.common.di.Dir
import com.shabinder.common.di.FetchPlatformQueryResult
import com.shabinder.common.di.analytics.AnalyticsManager
import com.shabinder.common.di.observeAsState
import com.shabinder.common.di.preference.PreferenceManager
import com.shabinder.common.models.Actions
import com.shabinder.common.models.DownloadStatus
import com.shabinder.common.models.PlatformActions
import com.shabinder.common.models.*
import com.shabinder.common.models.PlatformActions.Companion.SharedPreferencesKey
import com.shabinder.common.models.TrackDetails
import com.shabinder.common.models.methods
import com.shabinder.common.root.SpotiFlyerRoot
import com.shabinder.common.root.SpotiFlyerRoot.Analytics
import com.shabinder.common.root.callbacks.SpotiFlyerRootCallBacks
@ -84,17 +70,14 @@ import com.shabinder.spotiflyer.service.ForegroundService
import com.shabinder.spotiflyer.ui.AnalyticsDialog
import com.shabinder.spotiflyer.ui.NetworkDialog
import com.shabinder.spotiflyer.ui.PermissionDialog
import com.shabinder.spotiflyer.utils.checkAppSignature
import com.shabinder.spotiflyer.utils.checkIfLatestVersion
import com.shabinder.spotiflyer.utils.checkPermissions
import com.shabinder.spotiflyer.utils.disableDozeMode
import com.shabinder.spotiflyer.utils.requestStoragePermission
import com.shabinder.spotiflyer.utils.*
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.conflate
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koin.core.parameter.parametersOf
import org.matomo.sdk.extra.TrackHelper
import java.io.File
@ -104,12 +87,13 @@ class MainActivity : ComponentActivity() {
private val fetcher: FetchPlatformQueryResult by inject()
private val dir: Dir by inject()
private val preferenceManager: PreferenceManager by inject()
private val analyticsManager: AnalyticsManager by inject { parametersOf(this) }
private lateinit var root: SpotiFlyerRoot
private val callBacks: SpotiFlyerRootCallBacks get() = root.callBacks
private val trackStatusFlow = MutableSharedFlow<HashMap<String, DownloadStatus>>(1)
private var permissionGranted = mutableStateOf(true)
private val internetAvailability by lazy { ConnectionLiveData(applicationContext) }
private val tracker get() = (application as App).tracker
private val visibleChild get(): SpotiFlyerRoot.Child = root.routerState.value.activeChild.instance
// Variable for storing instance of our service class
@ -186,11 +170,10 @@ class MainActivity : ComponentActivity() {
* and Track Downloads for all other releases like F-Droid,
* for `Github Downloads` we will track Downloads using : https://tooomm.github.io/github-release-stats/?username=Shabinder&repository=SpotiFlyer
* */
if (isGithubRelease) { checkIfLatestVersion() }
if (preferenceManager.isAnalyticsEnabled && !isGithubRelease) {
// Download/App Install Event for F-Droid builds
TrackHelper.track().download().with(tracker)
if (isGithubRelease) {
checkIfLatestVersion()
}
// TODO Track Download Event
handleIntentFromExternalActivity()
initForegroundService()
@ -297,14 +280,19 @@ class MainActivity : ComponentActivity() {
}
}
override fun showPopUpMessage(string: String, long: Boolean) = this@MainActivity.showPopUpMessage(string, long)
override fun showPopUpMessage(string: String, long: Boolean) =
this@MainActivity.showPopUpMessage(string, long)
override fun setDownloadDirectoryAction(callBack: (String) -> Unit) = setUpOnPrefClickListener(callBack)
override fun setDownloadDirectoryAction(callBack: (String) -> Unit) =
setUpOnPrefClickListener(callBack)
override fun queryActiveTracks() = this@MainActivity.queryActiveTracks()
override fun giveDonation() {
openPlatform("", platformLink = "https://razorpay.com/payment-button/pl_GnKuuDBdBu0ank/view/?utm_source=payment_button&utm_medium=button&utm_campaign=payment_button")
openPlatform(
"",
platformLink = "https://razorpay.com/payment-button/pl_GnKuuDBdBu0ank/view/?utm_source=payment_button&utm_medium=button&utm_campaign=payment_button"
)
}
override fun shareApp() {
@ -341,7 +329,8 @@ class MainActivity : ComponentActivity() {
}
}
override fun writeMp3Tags(trackDetails: TrackDetails) { /*IMPLEMENTED*/ }
override fun writeMp3Tags(trackDetails: TrackDetails) { /*IMPLEMENTED*/
}
override val isInternetAvailable get() = internetAvailability.value ?: true
}
@ -351,35 +340,19 @@ class MainActivity : ComponentActivity() {
* */
override val analytics = object : Analytics {
override fun appLaunchEvent() {
if (preferenceManager.isAnalyticsEnabled) {
TrackHelper.track()
.event("events", "App_Launch")
.name("App Launch").with(tracker)
}
analyticsManager.sendEvent("app_launch")
}
override fun homeScreenVisit() {
if (preferenceManager.isAnalyticsEnabled) {
// HomeScreen Visit Event
TrackHelper.track().screen("/main_activity/home_screen")
.title("HomeScreen").with(tracker)
}
analyticsManager.sendView("home_screen")
}
override fun listScreenVisit() {
if (preferenceManager.isAnalyticsEnabled) {
// ListScreen Visit Event
TrackHelper.track().screen("/main_activity/list_screen")
.title("ListScreen").with(tracker)
}
analyticsManager.sendView("list_screen")
}
override fun donationDialogVisit() {
if (preferenceManager.isAnalyticsEnabled) {
// Donation Dialog Open Event
TrackHelper.track().screen("/main_activity/donation_dialog")
.title("DonationDialog").with(tracker)
}
analyticsManager.sendEvent("open_donation_dialog")
}
}
}
@ -469,7 +442,7 @@ class MainActivity : ComponentActivity() {
while (!this@MainActivity::root.isInitialized) {
delay(100)
}
if (methods.value.isInternetAvailable)callBacks.searchLink(link)
if (methods.value.isInternetAvailable) callBacks.searchLink(link)
}
}
}
@ -481,6 +454,16 @@ class MainActivity : ComponentActivity() {
unbindService()
}
override fun onStart() {
super.onStart()
analyticsManager.onStart()
}
override fun onStop() {
super.onStop()
analyticsManager.onStop()
}
companion object {
const val disableDozeCode = 1223
}

View File

@ -22,9 +22,9 @@ object Versions {
const val versionCode = 22
// Kotlin
const val kotlinVersion = "1.5.10"
const val kotlinVersion = "1.5.21"
const val coroutinesVersion = "1.5.0"
const val coroutinesVersion = "1.5.1"
// Code Formatting
const val ktLint = "10.1.0"
@ -41,24 +41,24 @@ object Versions {
const val mokoParcelize = "0.7.1"
// Internet
const val ktor = "1.6.0"
const val ktor = "1.6.2"
const val kotlinxSerialization = "1.2.1"
const val kotlinxSerialization = "1.2.2"
// Database
const val sqlDelight = "1.5.0"
const val sqlDelight = "1.5.1"
const val sqliteJdbcDriver = "3.34.0"
const val slf4j = "1.7.31"
// Internationalisation
const val i18n4k = "0.1.2"
const val i18n4k = "0.1.3"
// Android
const val minSdkVersion = 21
const val compileSdkVersion = 30
const val targetSdkVersion = 29
const val androidxLifecycle = "2.3.1"
const val androidxLifecycle = "2.4.0-alpha03"
}
object HostOS {
@ -81,8 +81,8 @@ object Koin {
}
object Androidx {
const val androidxActivity = "androidx.activity:activity-compose:1.3.0-beta02"
const val core = "androidx.core:core-ktx:1.5.0"
const val androidxActivity = "androidx.activity:activity-compose:1.3.1"
const val core = "androidx.core:core-ktx:1.6.0"
const val palette = "androidx.palette:palette-ktx:1.0.0"
const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-android:${Versions.coroutinesVersion}"
@ -98,6 +98,7 @@ object KTLint {
object JetBrains {
object Kotlin {
const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1-native-mt"
const val gradlePlugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlinVersion}"
const val serialization = "org.jetbrains.kotlin:kotlin-serialization:${Versions.kotlinVersion}"
const val testCommon = "org.jetbrains.kotlin:kotlin-test-common:${Versions.kotlinVersion}"
@ -107,15 +108,16 @@ object JetBrains {
object Compose {
// __LATEST_COMPOSE_RELEASE_VERSION__
const val VERSION = "0.4.0"
private const val VERSION = "1.0.0-alpha3"
const val gradlePlugin = "org.jetbrains.compose:compose-gradle-plugin:$VERSION"
}
}
object Mosaic {
const val gradlePlugin = "com.jakewharton.mosaic:mosaic-gradle-plugin:${Versions.mosaic}"
}
object Decompose {
private const val VERSION = "0.2.6"
private const val VERSION = "0.3.1"
const val decompose = "com.arkivanov.decompose:decompose:$VERSION"
const val decomposeIosX64 = "com.arkivanov.decompose:decompose-iosx64:$VERSION"
const val decomposeIosArm64 = "com.arkivanov.decompose:decompose-iosarm64:$VERSION"
@ -164,16 +166,13 @@ object Extras {
const val jaudioTagger = "com.github.Shabinder:JAudioTagger-Android:1.0"
const val kermit = "co.touchlab:kermit:${Versions.kermit}"
object Android {
object Acra {
// Self Hosted Crashlytics (FOSS)
private const val VERSION = "5.8.3"
val http = "ch.acra:acra-http:$VERSION"
val notification = "ch.acra:acra-notification:$VERSION"
}
// Self Hosted Analytics (FOSS)
val matomo = "org.matomo.sdk:tracker:4.1.2"
// Self Hosted Analytics & Crashlytics (FOSS)
val countly = "ly.count.android:sdk:20.11.8"
val appUpdator = "com.github.amitbd1508:AppUpdater:4.1.0"
}
object Desktop {
val countly = "ly.count.sdk:java:20.11.0"
}
}
object Serialization {

View File

@ -37,7 +37,6 @@ android {
sourceSets {
named("main") {
manifest.srcFile("src/androidMain/AndroidManifest.xml")
java.srcDirs("src/androidMain/kotlin")
res.srcDirs("src/androidMain/res")
}
}

View File

@ -43,7 +43,7 @@ kotlin {
implementation(Extras.kermit)
implementation("dev.icerock.moko:parcelize:${Versions.mokoParcelize}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-native-mt") {
implementation(JetBrains.Kotlin.coroutines) {
@Suppress("DEPRECATION")
isForce = true
}
@ -51,7 +51,7 @@ kotlin {
}
named("androidMain") {
dependencies {
implementation("androidx.appcompat:appcompat:1.3.0")
implementation(Androidx.androidxActivity)
implementation(Androidx.core)
}
}

View File

@ -66,7 +66,7 @@ kotlin {
implementation(Serialization.json)
implementation("co.touchlab:stately-common:1.1.7")
implementation("dev.icerock.moko:parcelize:${Versions.mokoParcelize}")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-native-mt") {
implementation(JetBrains.Kotlin.coroutines) {
@Suppress("DEPRECATION")
isForce = true
}
@ -75,7 +75,7 @@ kotlin {
named("androidMain") {
dependencies {
implementation("androidx.appcompat:appcompat:1.3.0")
implementation(Androidx.androidxActivity)
implementation(Androidx.core)
implementation(compose.runtime)
implementation(compose.material)

View File

@ -42,6 +42,7 @@ kotlin {
dependencies {
implementation(compose.materialIconsExtended)
implementation(Extras.mp3agic)
implementation(Extras.Android.countly)
// implementation(files("$rootDir/libs/mobile-ffmpeg.aar"))
}
}
@ -49,6 +50,7 @@ kotlin {
dependencies {
implementation(compose.materialIconsExtended)
implementation(Extras.mp3agic)
implementation(Extras.Desktop.countly)
}
}
jsMain {

View File

@ -0,0 +1,71 @@
package com.shabinder.common.di.analytics
import android.app.Activity
import android.app.Application
import ly.count.android.sdk.Countly
import ly.count.android.sdk.CountlyConfig
import ly.count.android.sdk.DeviceId
import org.koin.dsl.bind
import org.koin.dsl.module
internal class AndroidAnalyticsManager(private val mainActivity: Activity) : AnalyticsManager {
init {
init()
}
override fun init() {
Countly.sharedInstance().init(
CountlyConfig(
mainActivity.applicationContext as Application,
COUNTLY_CONFIG.APP_KEY,
COUNTLY_CONFIG.SERVER_URL
).apply {
setIdMode(DeviceId.Type.OPEN_UDID)
setViewTracking(true)
enableCrashReporting()
setLoggingEnabled(true)
setRecordAllThreadsWithCrash()
setRequiresConsent(true)
setShouldIgnoreAppCrawlers(true)
setEventQueueSizeToSend(5)
}
)
}
override fun onStart() {
Countly.sharedInstance().onStart(mainActivity)
}
override fun onStop() {
Countly.sharedInstance().onStop()
}
override fun giveConsent() {
Countly.sharedInstance().consent().giveConsentAll()
}
override fun isTracking(): Boolean = Countly.sharedInstance().consent().getConsent(Countly.CountlyFeatureNames.events)
override fun revokeConsent() {
Countly.sharedInstance().consent().removeConsentAll()
}
override fun sendView(name: String, extras: Map<String, Any>) {
Countly.sharedInstance().views().recordView(name, extras)
}
override fun sendEvent(eventName: String, extras: Map<String, Any>) {
Countly.sharedInstance().events().recordEvent(eventName, extras)
}
override fun sendCrashReport(error: Throwable, extras: Map<String, Any>) {
Countly.sharedInstance().crashes().recordUnhandledException(error, extras)
}
}
actual fun analyticsModule() = module {
factory { (mainActivity: Activity) ->
AndroidAnalyticsManager(mainActivity)
} bind AnalyticsManager::class
}

View File

@ -20,6 +20,7 @@ import co.touchlab.kermit.Kermit
import com.russhwolf.settings.Settings
import com.shabinder.common.database.databaseModule
import com.shabinder.common.database.getLogger
import com.shabinder.common.di.analytics.analyticsModule
import com.shabinder.common.di.preference.PreferenceManager
import com.shabinder.common.di.providers.providersModule
import io.ktor.client.*
@ -39,6 +40,7 @@ fun initKoin(enableNetworkLogs: Boolean = false, appDeclaration: KoinAppDeclarat
appDeclaration()
modules(
commonModule(enableNetworkLogs = enableNetworkLogs),
analyticsModule(),
providersModule(),
databaseModule()
)

View File

@ -0,0 +1,23 @@
package com.shabinder.common.di.analytics
import org.koin.core.module.Module
interface AnalyticsManager {
fun init()
fun onStart()
fun onStop()
fun giveConsent()
fun isTracking(): Boolean
fun revokeConsent()
fun sendView(name: String, extras: Map<String, Any> = emptyMap())
fun sendEvent(eventName: String, extras: Map<String, Any> = emptyMap())
fun sendCrashReport(error: Throwable, extras: Map<String, Any> = emptyMap())
}
@Suppress("ClassName", "SpellCheckingInspection")
object COUNTLY_CONFIG {
const val APP_KEY = "27820f304468cc651ef47d787f0cb5fe11c577df"
const val SERVER_URL = "https://counlty.shabinder.in"
}
expect fun analyticsModule(): Module

View File

@ -14,8 +14,8 @@ class PreferenceManager(settings: Settings) : Settings by settings {
}
/* ANALYTICS */
val isAnalyticsEnabled get() = getBooleanOrNull(ANALYTICS_KEY) ?: false
fun toggleAnalytics(enabled: Boolean) = putBoolean(ANALYTICS_KEY, enabled)
// val isAnalyticsEnabled get() = getBooleanOrNull(ANALYTICS_KEY) ?: false
// fun toggleAnalytics(enabled: Boolean) = putBoolean(ANALYTICS_KEY, enabled)
/* DOWNLOAD DIRECTORY */
val downloadDir get() = getStringOrNull(DIR_KEY)

View File

@ -0,0 +1,82 @@
package com.shabinder.common.di.analytics
import com.shabinder.common.di.Dir
import ly.count.sdk.java.Config
import ly.count.sdk.java.Config.DeviceIdStrategy
import ly.count.sdk.java.Config.Feature
import ly.count.sdk.java.ConfigCore.LoggingLevel
import ly.count.sdk.java.Countly
import org.koin.dsl.bind
import org.koin.dsl.module
import java.io.File
internal class DesktopAnalyticsManager(
private val dir: Dir
) : AnalyticsManager {
init {
init()
}
override fun init() {
val config: Config = Config(COUNTLY_CONFIG.SERVER_URL, COUNTLY_CONFIG.APP_KEY).apply {
eventsBufferSize = 2
loggingLevel = LoggingLevel.DEBUG
setDeviceIdStrategy(DeviceIdStrategy.UUID)
enableFeatures(*featuresSet)
setRequiresConsent(true)
}
Countly.init(File(dir.defaultDir()), config)
Countly.session().begin();
}
override fun giveConsent() {
Countly.onConsent(*featuresSet)
}
override fun isTracking(): Boolean = Countly.isTracking(Feature.Events)
override fun revokeConsent() {
Countly.onConsentRemoval(*featuresSet)
}
override fun sendView(name: String, extras: Map<String, Any>) {
Countly.api().view(name)
}
override fun sendEvent(eventName: String, extras: Map<String, Any>) {
Countly.api().event(eventName)
.setSegmentation(extras.filterValues { it is String } as? Map<String, String> ?: emptyMap()).record()
}
override fun sendCrashReport(error: Throwable, extras: Map<String, Any>) {
Countly.api().addCrashReport(
error,
extras.getOrDefault("fatal", true) as Boolean,
error.javaClass.simpleName,
extras.filterValues { it is String } as? Map<String, String> ?: emptyMap()
)
}
companion object {
val featuresSet = arrayOf(
Feature.Events,
Feature.Sessions,
Feature.CrashReporting,
Feature.Views,
Feature.UserProfiles,
Feature.Location,
)
}
override fun onStart() {}
override fun onStop() {}
}
actual fun analyticsModule() = module {
single { DesktopAnalyticsManager(get()) } bind AnalyticsManager::class
}

View File

@ -0,0 +1,30 @@
package com.shabinder.common.di.analytics
import org.koin.dsl.bind
import org.koin.dsl.module
// TODO("Not yet implemented")
private val webAnalytics =
object : AnalyticsManager {
override fun init() {}
override fun onStart() {}
override fun onStop() {}
override fun giveConsent() {}
override fun isTracking(): Boolean = false
override fun revokeConsent() {}
override fun sendView(name: String, extras: Map<String, Any>) {}
override fun sendEvent(eventName: String, extras: Map<String, Any>) {}
override fun sendCrashReport(error: Throwable, extras: Map<String, Any>) {}
}
actual fun analyticsModule() = module {
single { webAnalytics } bind AnalyticsManager::class
}

View File

@ -50,7 +50,7 @@ dependencies {
implementation(Ktor.clientSerialization)
implementation(Serialization.json)
// testDeps
testImplementation(kotlin("test-junit"))
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:1.5.21")
}
tasks.test {

View File

@ -26,7 +26,7 @@ dependencies {
implementation(Ktor.clientSerialization)
implementation(Serialization.json)
// testDeps
testImplementation(kotlin("test-junit"))
testImplementation("org.jetbrains.kotlin:kotlin-test-junit:1.5.21")
}
tasks.test {

View File

@ -27,7 +27,7 @@ repositories {
}
dependencies {
implementation(kotlin("stdlib-js"))
implementation("org.jetbrains.kotlin:kotlin-stdlib-js:1.5.21")
implementation(Koin.core)
implementation(Extras.kermit)
implementation(Decompose.decompose)
@ -44,11 +44,11 @@ dependencies {
implementation("co.touchlab:stately-common:1.1.7")
implementation("dev.icerock.moko:parcelize:${Versions.mokoParcelize}")
// implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.1")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.1") {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2") {
// https://youtrack.jetbrains.com/issue/KTOR-2670
isForce = true
}
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0-native-mt") {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.1-native-mt") {
@Suppress("DEPRECATION")
isForce = true
}