diff --git a/build.gradle.kts b/build.gradle.kts index fe0c5c24..8ec9cbe3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,10 +6,10 @@ plugins { id("convention.plugin.root") alias(libs.plugins.android.application) apply false alias(libs.plugins.android.library).apply(false) + alias(libs.plugins.androidKmpLibrary) apply false alias(libs.plugins.kotlin.multiplatform) apply false alias(libs.plugins.android.lint) apply false alias(libs.plugins.android.test) apply false - alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.serialization) apply false alias(libs.plugins.cacheFixPlugin) apply false alias(libs.plugins.spotless) apply false diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Android.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Android.kt index e575f14d..7ba58507 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Android.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/Android.kt @@ -2,20 +2,21 @@ // SPDX-License-Identifier: Apache-2.0 package com.addhen.gradle.convention +import com.android.build.api.dsl.ApplicationExtension +import com.android.build.api.dsl.LibraryExtension import com.android.build.api.variant.AndroidComponentsExtension import com.android.build.api.variant.HasUnitTestBuilder -import com.android.build.gradle.BaseExtension import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.kotlin.dsl.configure -fun Project.configureAndroid() { - val localCompileSdk = this.libs.version("compileSdk").requiredVersion.toInt() +fun Project.configureAndroidApplication() { + val localCompileSdk = libs.version("compileSdk").requiredVersion.toInt() val localMinSdk = libs.version("minSdk").requiredVersion.toInt() val localTargetSdk = libs.version("targetSdk").requiredVersion.toInt() - android { - compileSdkVersion(localCompileSdk) + extensions.configure { + compileSdk = localCompileSdk defaultConfig { minSdk = localMinSdk @@ -30,7 +31,33 @@ fun Project.configureAndroid() { } } - androidComponents { + configureAndroidComponents() +} + +fun Project.configureAndroidLibrary() { + val localCompileSdk = libs.version("compileSdk").requiredVersion.toInt() + val localMinSdk = libs.version("minSdk").requiredVersion.toInt() + + extensions.configure { + compileSdk = localCompileSdk + + defaultConfig { + minSdk = localMinSdk + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + } + + configureAndroidComponents() +} + +private fun Project.configureAndroidComponents() { + extensions.configure(AndroidComponentsExtension::class.java) { beforeVariants(selector().withBuildType("release")) { variantBuilder -> (variantBuilder as? HasUnitTestBuilder)?.apply { enableUnitTest = false @@ -38,9 +65,3 @@ fun Project.configureAndroid() { } } } - -private fun Project.android(action: BaseExtension.() -> Unit) = extensions.configure(action) - -private fun Project.androidComponents(action: AndroidComponentsExtension<*, *, *>.() -> Unit) { - extensions.configure(AndroidComponentsExtension::class.java, action) -} diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidApplicationConventionPlugin.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidApplicationConventionPlugin.kt index bb2f1343..a927f846 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidApplicationConventionPlugin.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidApplicationConventionPlugin.kt @@ -1,6 +1,6 @@ package com.addhen.gradle.convention.plugin -import com.addhen.gradle.convention.configureAndroid +import com.addhen.gradle.convention.configureAndroidApplication import org.gradle.api.Plugin import org.gradle.api.Project @@ -12,7 +12,7 @@ class AndroidApplicationConventionPlugin : Plugin { apply("org.gradle.android.cache-fix") } - configureAndroid() + configureAndroidApplication() } } } diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidLibraryConventionPlugin.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidLibraryConventionPlugin.kt index 5940b817..c1861cae 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidLibraryConventionPlugin.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/AndroidLibraryConventionPlugin.kt @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package com.addhen.gradle.convention.plugin -import com.addhen.gradle.convention.configureAndroid +import com.addhen.gradle.convention.configureAndroidLibrary import org.gradle.api.Plugin import org.gradle.api.Project @@ -14,7 +14,7 @@ class AndroidLibraryConventionPlugin : Plugin { apply("org.gradle.android.cache-fix") } - configureAndroid() + configureAndroidLibrary() } } } diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinAndroidConventionPlugin.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinAndroidConventionPlugin.kt index e3b9daca..3c4b3169 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinAndroidConventionPlugin.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinAndroidConventionPlugin.kt @@ -10,10 +10,6 @@ import org.gradle.api.Project class KotlinAndroidConventionPlugin : Plugin { override fun apply(target: Project) { with(target) { - with(pluginManager) { - apply("org.jetbrains.kotlin.android") - } - configureSpotless() configureKotlin() } diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinMultiplatformConventionPlugin.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinMultiplatformConventionPlugin.kt index 9077aaee..906a1e1b 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinMultiplatformConventionPlugin.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/KotlinMultiplatformConventionPlugin.kt @@ -19,13 +19,7 @@ class KotlinMultiplatformConventionPlugin : Plugin { kotlin { applyDefaultHierarchyTemplate() - if (pluginManager.hasPlugin("com.android.library")) { - androidTarget { - publishLibraryVariants("release") - } - } - - iosX64() + //iosX64() iosArm64() iosSimulatorArm64() diff --git a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/MetalavaConventionPlugin.kt b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/MetalavaConventionPlugin.kt index d2e5b0b5..b02564ff 100644 --- a/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/MetalavaConventionPlugin.kt +++ b/convention-plugins/src/main/kotlin/com/addhen/gradle/convention/plugin/MetalavaConventionPlugin.kt @@ -17,15 +17,11 @@ class MetalavaConventionPlugin : Plugin { metalava { filename.set("api/api.txt") - sourcePaths.setFrom( - target.kotlin.sourceSets - .filterNot { it.name.contains("test", ignoreCase = true) } - .flatMap { it.kotlin.sourceDirectories }, - ) } tasks.named { it.startsWith("metalavaCheckCompatibility") }.configureEach { dependsOn(tasks.named { it.startsWith("generateResourceAccessors") }) + dependsOn(tasks.named { it.startsWith("generateActualResourceCollectors") }) } } } diff --git a/dokka/build.gradle.kts b/dokka/build.gradle.kts index 20eb0894..5b702589 100644 --- a/dokka/build.gradle.kts +++ b/dokka/build.gradle.kts @@ -3,7 +3,7 @@ plugins { - id("convention.plugin.android.library") + alias(libs.plugins.androidKmpLibrary) id("convention.plugin.kotlin.multiplatform") alias(libs.plugins.dokka) } @@ -14,10 +14,14 @@ dependencies { dokka(projects.kanalyticsViewerNoOp) } -android { - namespace = "com.addhen.kanalytics.viewer.docs" -} - dokka { moduleName.set("KAnalytics") } + +kotlin { + android { + namespace = "com.addhen.kanalytics.viewer.docs" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c21e2e87..15b6d39c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,18 +4,18 @@ kanalytics = "1.5.0-SNAPSHOT" minSdk = "24" targetSdk = "36" -compileSdk = "36" -agp = "8.13.2" -kotlin = "2.3.21" -spotless = "8.0.0" -metalava = "0.3.5" -compose-multiplatform = "1.10.0" +compileSdk = "37" +agp = "9.2.1" +kotlin = "2.4.0" +spotless = "8.6.0" +metalava = "0.5.0" +compose-multiplatform = "1.11.1" cacheFixPlugin = "3.0.3" -dokka = "2.1.0" -coroutines = "1.10.2" -androidx-core-ktx = "1.17.0" +dokka = "2.2.0" +coroutines = "1.11.0" +androidx-core-ktx = "1.19.0" androidx-activity-compose = "1.13.0" -material = "1.13.0" +material = "1.14.0" appcompat = "1.7.1" # Version 2.8.0-alpha13 causes this issue on iOS builds: @@ -26,18 +26,18 @@ appcompat = "1.7.1" # accessed in module # Before you bump this version higher than 2.8.0-alpha13 check the iOS app to make # it still works. -navigation-compose = "2.9.1" # Make use of type-safe compose navigation -kotlinx-serializer = "1.9.0" -lifecycle-viewmodel-compose = "2.9.6" -kermit = "2.0.8" +navigation-compose = "2.9.2" # Make use of type-safe compose navigation +kotlinx-serializer = "1.11.0" +lifecycle-viewmodel-compose = "2.10.0" +kermit = "2.1.0" kotlinx-collections-immutable = "0.4.0" -kotlinx-datetime = "0.7.1-0.6.x-compat" -sqldelight = "2.1.0" +kotlinx-datetime = "0.8.0" +sqldelight = "2.3.2" startup-runtime = "1.2.0" composeDataTable = "0.11.4" -mokkery = "2.10.2" +mokkery = "3.4.1" json-tree = "2.6.0" -kotlinx-atomicfu = "0.29.0" +kotlinx-atomicfu = "0.33.0" multiplatformsettings = "1.3.0" androidx-preference = "1.2.1" baselineprofile = "1.4.1" @@ -46,7 +46,7 @@ espressoCore = "3.7.0" uiautomator = "2.3.0" benchmarkMacroJunit4 = "1.4.1" profileinstaller = "1.4.1" -maven-publish = "0.34.0" +maven-publish = "0.36.0" [libraries] kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } @@ -65,6 +65,7 @@ androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version androidx-navigation-compose = { module = "org.jetbrains.androidx.navigation:navigation-compose", version.ref = "navigation-compose" } kotlinx-serialization = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinx-serializer" } lifecycle-viewmodel-compose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle-viewmodel-compose" } +lifecycle-runtime-compose = { module = "org.jetbrains.androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycle-viewmodel-compose" } touchlab-kermit = { module = "co.touchlab:kermit", version.ref = "kermit" } kotlinx-collections-immutable = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "kotlinx-collections-immutable" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } @@ -88,6 +89,7 @@ androidx-profileinstaller = { group = "androidx.profileinstaller", name = "profi [plugins] android-application = { id = "com.android.application", version.ref = "agp" } +androidKmpLibrary = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } android-lint = { id = "com.android.lint", version.ref = "agp" } android-test = { id = "com.android.test", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } @@ -99,7 +101,6 @@ compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = " compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "compose-multiplatform" } cacheFixPlugin = { id = "org.gradle.android.cache-fix", version.ref = "cacheFixPlugin" } dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } sqldelight = { id = "app.cash.sqldelight", version.ref = "sqldelight" } mokkery = { id = "dev.mokkery", version.ref = "mokkery" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55b..b1b8ef56 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index eac39ca8..81ba9e88 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,6 +3,8 @@ distributionPath=wrapper/dists distributionSha256Sum=c72fb9991f6025cbe337d52ba77e531b3faf62bdd3e348fe1ccee9f51c71adb0 distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-all.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 23d15a93..b9bb139f 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index db3a6ac2..24c62d56 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -23,8 +23,8 @@ @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,30 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/kanalytics-viewer-base-profile/build.gradle.kts b/kanalytics-viewer-base-profile/build.gradle.kts index 580c5860..fec509ef 100644 --- a/kanalytics-viewer-base-profile/build.gradle.kts +++ b/kanalytics-viewer-base-profile/build.gradle.kts @@ -7,7 +7,6 @@ import com.android.build.api.dsl.ManagedVirtualDevice plugins { alias(libs.plugins.android.test) id("convention.plugin.kotlin.android") - alias(libs.plugins.androidx.baselineprofile) } android { @@ -58,10 +57,3 @@ androidComponents { ) } } - -@Suppress("UnstableApiUsage") -baselineProfile { - managedDevices += "api34" - useConnectedDevices = false - enableEmulatorDisplay = true -} diff --git a/kanalytics-viewer-no-op/api/api.txt b/kanalytics-viewer-no-op/api/api.txt index 8a64b31e..5c5a2e48 100644 --- a/kanalytics-viewer-no-op/api/api.txt +++ b/kanalytics-viewer-no-op/api/api.txt @@ -2,11 +2,13 @@ package com.addhen.kanalytics.viewer { public final class KAnalyticsCollector { - ctor public KAnalyticsCollector(optional boolean showNotification, optional int duration); - method public void onEventSent(com.addhen.kanalytics.KAnalyticsEvent kAnalyticsEvent, String KTrackerName, kotlinx.datetime.Instant onSentDate); + ctor public KAnalyticsCollector(); + ctor @KotlinOnly public KAnalyticsCollector(optional boolean showNotification, optional com.addhen.kanalytics.viewer.RetentionPolicyManager.DayDuration duration); + method @KotlinOnly public void onEventSent(com.addhen.kanalytics.KAnalyticsEvent kAnalyticsEvent, com.addhen.kanalytics.KTrackerName KTrackerName, kotlin.time.Instant onSentDate); } public final class KAnalyticsInterceptor implements com.addhen.kanalytics.Interceptor { + ctor public KAnalyticsInterceptor(); ctor public KAnalyticsInterceptor(optional com.addhen.kanalytics.viewer.KAnalyticsCollector collector, optional Object clock); method public com.addhen.kanalytics.KAnalyticsEvent intercept(com.addhen.kanalytics.Interceptor.Chain chain); } @@ -25,9 +27,9 @@ package com.addhen.kanalytics.viewer { } @kotlin.jvm.JvmInline public static final value class RetentionPolicyManager.DayDuration { - ctor public RetentionPolicyManager.DayDuration(int numberOfDays); - method public int getNumberOfDays(); - property public final int numberOfDays; + ctor @KotlinOnly public RetentionPolicyManager.DayDuration(int numberOfDays); + method @InaccessibleFromKotlin public int getNumberOfDays(); + property public int numberOfDays; } } diff --git a/kanalytics-viewer-no-op/build.gradle.kts b/kanalytics-viewer-no-op/build.gradle.kts index 138c0272..8331c1f2 100644 --- a/kanalytics-viewer-no-op/build.gradle.kts +++ b/kanalytics-viewer-no-op/build.gradle.kts @@ -3,7 +3,7 @@ plugins { - id("convention.plugin.android.library") + alias(libs.plugins.androidKmpLibrary) id("convention.plugin.kotlin.multiplatform") alias(libs.plugins.dokka) id("convention.plugin.maven.publication") @@ -11,6 +11,12 @@ plugins { } kotlin { + android { + namespace = "com.addhen.kanalytics.viewer.noop" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + } + sourceSets { commonMain { dependencies { @@ -21,19 +27,6 @@ kotlin { } } -android { - namespace = "com.addhen.kanalytics.viewer" - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - unitTests { - isIncludeAndroidResources = true - } - } -} - // Configure test tasks to not fail when no tests are discovered // This is appropriate for this no-op module that doesn't need tests tasks.withType { diff --git a/kanalytics-viewer/api/api.txt b/kanalytics-viewer/api/api.txt index d31eab36..0e65dbe0 100644 --- a/kanalytics-viewer/api/api.txt +++ b/kanalytics-viewer/api/api.txt @@ -6,24 +6,21 @@ package com.addhen.kanalytics.viewer { method public void setupShortcut(boolean show); } - public final class DefaultShortcutManager implements com.addhen.kanalytics.viewer.ShortcutManager { - ctor public DefaultShortcutManager(); - method public void setupShortcut(boolean show); - } - public final class KAnalyticsCollector { - ctor public KAnalyticsCollector(optional boolean showShortcut, optional int duration, optional com.addhen.kanalytics.viewer.ShortcutManager shortcutManager, optional boolean showNotification, optional kotlinx.coroutines.CoroutineScope scope, optional com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository repository, optional com.addhen.kanalytics.viewer.app.shared.AppCoroutineDispatchers appCoroutineDispatchers, optional com.addhen.kanalytics.viewer.app.NotificationManager notificationManager); - method public void onEventSent(com.addhen.kanalytics.KAnalyticsEvent kAnalyticsEvent, String kTrackerName, kotlinx.datetime.Instant onSentDate); + ctor public KAnalyticsCollector(); + ctor @KotlinOnly public KAnalyticsCollector(optional boolean showShortcut, optional com.addhen.kanalytics.viewer.RetentionPolicyManager.DayDuration duration, optional com.addhen.kanalytics.viewer.ShortcutManager shortcutManager, optional boolean showNotification, optional kotlinx.coroutines.CoroutineScope scope, optional com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository repository, optional com.addhen.kanalytics.viewer.app.shared.AppCoroutineDispatchers appCoroutineDispatchers, optional com.addhen.kanalytics.viewer.app.NotificationManager notificationManager); + method @KotlinOnly public void onEventSent(com.addhen.kanalytics.KAnalyticsEvent kAnalyticsEvent, com.addhen.kanalytics.KTrackerName kTrackerName, kotlin.time.Instant onSentDate); } public final class KAnalyticsInterceptor implements com.addhen.kanalytics.Interceptor { - ctor public KAnalyticsInterceptor(optional com.addhen.kanalytics.viewer.KAnalyticsCollector collector, optional kotlinx.datetime.Clock clock); + ctor public KAnalyticsInterceptor(); + ctor public KAnalyticsInterceptor(optional com.addhen.kanalytics.viewer.KAnalyticsCollector collector, optional kotlin.time.Clock clock); method public com.addhen.kanalytics.KAnalyticsEvent intercept(com.addhen.kanalytics.Interceptor.Chain chain); } public final class KAnalyticsViewerShorcutHandlerKt { method public static String getShortcutType(); - method public static error.NonExistentClass! getUISceneConfiguration(error.NonExistentClass configurationForConnectingSceneSession); + method public static UISceneConfiguration getUISceneConfiguration(UISceneSession configurationForConnectingSceneSession); } public final class LaunchViewerApp_androidKt { @@ -32,18 +29,19 @@ package com.addhen.kanalytics.viewer { public final class LaunchViewerApp_iosKt { method public static void launchViewerApp(); + property public static String SHORTCUT_TYPE; field public static final String SHORTCUT_TYPE = "com.addhen.kanalytics.viewer.launch"; } public final class RetentionPolicyManager { - ctor public RetentionPolicyManager(optional kotlinx.datetime.Clock clock, int dayDuration, com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository repository); + ctor @KotlinOnly public RetentionPolicyManager(optional kotlin.time.Clock clock, com.addhen.kanalytics.viewer.RetentionPolicyManager.DayDuration dayDuration, com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository repository); method public suspend Object? processDataRetention(kotlin.coroutines.Continuation); } @kotlin.jvm.JvmInline public static final value class RetentionPolicyManager.DayDuration { - ctor public RetentionPolicyManager.DayDuration(int numberOfDays); - method public int getNumberOfDays(); - property public final int numberOfDays; + ctor @KotlinOnly public RetentionPolicyManager.DayDuration(int numberOfDays); + method @InaccessibleFromKotlin public int getNumberOfDays(); + property public int numberOfDays; } public interface ShortcutManager { @@ -72,6 +70,7 @@ package com.addhen.kanalytics.viewer.app.android { package com.addhen.kanalytics.viewer.app.shared { public final class AppCoroutineDispatchers { + ctor public AppCoroutineDispatchers(); ctor public AppCoroutineDispatchers(optional kotlinx.coroutines.CoroutineDispatcher io, optional kotlinx.coroutines.CoroutineDispatcher default, optional kotlinx.coroutines.CoroutineDispatcher databaseRead, optional kotlinx.coroutines.CoroutineDispatcher databaseWrite, optional kotlinx.coroutines.CoroutineDispatcher computation, optional kotlinx.coroutines.CoroutineDispatcher main); method public kotlinx.coroutines.CoroutineDispatcher component1(); method public kotlinx.coroutines.CoroutineDispatcher component2(); @@ -79,19 +78,19 @@ package com.addhen.kanalytics.viewer.app.shared { method public kotlinx.coroutines.CoroutineDispatcher component4(); method public kotlinx.coroutines.CoroutineDispatcher component5(); method public kotlinx.coroutines.CoroutineDispatcher component6(); - method public com.addhen.kanalytics.viewer.app.shared.AppCoroutineDispatchers copy(kotlinx.coroutines.CoroutineDispatcher io, kotlinx.coroutines.CoroutineDispatcher default, kotlinx.coroutines.CoroutineDispatcher databaseRead, kotlinx.coroutines.CoroutineDispatcher databaseWrite, kotlinx.coroutines.CoroutineDispatcher computation, kotlinx.coroutines.CoroutineDispatcher main); - method public kotlinx.coroutines.CoroutineDispatcher getComputation(); - method public kotlinx.coroutines.CoroutineDispatcher getDatabaseRead(); - method public kotlinx.coroutines.CoroutineDispatcher getDatabaseWrite(); - method public kotlinx.coroutines.CoroutineDispatcher getDefault(); - method public kotlinx.coroutines.CoroutineDispatcher getIo(); - method public kotlinx.coroutines.CoroutineDispatcher getMain(); - property public final kotlinx.coroutines.CoroutineDispatcher computation; - property public final kotlinx.coroutines.CoroutineDispatcher databaseRead; - property public final kotlinx.coroutines.CoroutineDispatcher databaseWrite; - property public final kotlinx.coroutines.CoroutineDispatcher default; - property public final kotlinx.coroutines.CoroutineDispatcher io; - property public final kotlinx.coroutines.CoroutineDispatcher main; + method public com.addhen.kanalytics.viewer.app.shared.AppCoroutineDispatchers copy(optional kotlinx.coroutines.CoroutineDispatcher io, optional kotlinx.coroutines.CoroutineDispatcher default, optional kotlinx.coroutines.CoroutineDispatcher databaseRead, optional kotlinx.coroutines.CoroutineDispatcher databaseWrite, optional kotlinx.coroutines.CoroutineDispatcher computation, optional kotlinx.coroutines.CoroutineDispatcher main); + method @InaccessibleFromKotlin public kotlinx.coroutines.CoroutineDispatcher getComputation(); + method @InaccessibleFromKotlin public kotlinx.coroutines.CoroutineDispatcher getDatabaseRead(); + method @InaccessibleFromKotlin public kotlinx.coroutines.CoroutineDispatcher getDatabaseWrite(); + method @InaccessibleFromKotlin public kotlinx.coroutines.CoroutineDispatcher getDefault(); + method @InaccessibleFromKotlin public kotlinx.coroutines.CoroutineDispatcher getIo(); + method @InaccessibleFromKotlin public kotlinx.coroutines.CoroutineDispatcher getMain(); + property public kotlinx.coroutines.CoroutineDispatcher computation; + property public kotlinx.coroutines.CoroutineDispatcher databaseRead; + property public kotlinx.coroutines.CoroutineDispatcher databaseWrite; + property public kotlinx.coroutines.CoroutineDispatcher default; + property public kotlinx.coroutines.CoroutineDispatcher io; + property public kotlinx.coroutines.CoroutineDispatcher main; } } @@ -104,22 +103,82 @@ package com.addhen.kanalytics.viewer.app.shared.data.database { } +package com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight { + + public interface EventViewerDatabase extends app.cash.sqldelight.Transacter { + method @InaccessibleFromKotlin public com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.Event_dataQueries getEvent_dataQueries(); + property public abstract com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.Event_dataQueries event_dataQueries; + field public static final com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.EventViewerDatabase.Companion Companion; + } + + public static final class EventViewerDatabase.Companion { + method @InaccessibleFromKotlin public app.cash.sqldelight.db.SqlSchema> getSchema(); + method public operator com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.EventViewerDatabase invoke(app.cash.sqldelight.db.SqlDriver driver, com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.Event_data.Adapter event_dataAdapter); + property public app.cash.sqldelight.db.SqlSchema> Schema; + } + + public final class Event_data { + ctor public Event_data(long id, String event_name, String tracker_name, String? event_description, kotlin.time.Instant event_created_date, java.util.Map event_properties); + method public long component1(); + method public String component2(); + method public String component3(); + method public String? component4(); + method public kotlin.time.Instant component5(); + method public java.util.Map component6(); + method public com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.Event_data copy(optional long id, optional String event_name, optional String tracker_name, optional String? event_description, optional kotlin.time.Instant event_created_date, optional java.util.Map event_properties); + method @InaccessibleFromKotlin public kotlin.time.Instant getEvent_created_date(); + method @InaccessibleFromKotlin public String? getEvent_description(); + method @InaccessibleFromKotlin public String getEvent_name(); + method @InaccessibleFromKotlin public java.util.Map getEvent_properties(); + method @InaccessibleFromKotlin public long getId(); + method @InaccessibleFromKotlin public String getTracker_name(); + property public kotlin.time.Instant event_created_date; + property public String? event_description; + property public String event_name; + property public java.util.Map event_properties; + property public long id; + property public String tracker_name; + } + + public static final class Event_data.Adapter { + ctor public Event_data.Adapter(app.cash.sqldelight.ColumnAdapter event_created_dateAdapter, app.cash.sqldelight.ColumnAdapter,java.lang.String> event_propertiesAdapter); + method @InaccessibleFromKotlin public app.cash.sqldelight.ColumnAdapter getEvent_created_dateAdapter(); + method @InaccessibleFromKotlin public app.cash.sqldelight.ColumnAdapter,java.lang.String> getEvent_propertiesAdapter(); + property public app.cash.sqldelight.ColumnAdapter event_created_dateAdapter; + property public app.cash.sqldelight.ColumnAdapter,java.lang.String> event_propertiesAdapter; + } + + public final class Event_dataQueries extends app.cash.sqldelight.TransacterImpl { + ctor public Event_dataQueries(app.cash.sqldelight.db.SqlDriver driver, com.addhen.kanalytics.viewer.app.shared.data.database.sqlidelight.Event_data.Adapter event_dataAdapter); + method public app.cash.sqldelight.db.QueryResult deleteAllEventData(); + method public app.cash.sqldelight.db.QueryResult deleteAllEventDataOlderThan(kotlin.time.Instant date); + method public app.cash.sqldelight.Query getAllEventData(); + method public app.cash.sqldelight.Query getAllEventData(kotlin.jvm.functions.Function6,? extends T> mapper); + method public app.cash.sqldelight.Query getEventDataById(long id); + method public app.cash.sqldelight.Query getEventDataById(long id, kotlin.jvm.functions.Function6,? extends T> mapper); + method public app.cash.sqldelight.db.QueryResult insertEventData(String event_name, String? event_description, String tracker_name, kotlin.time.Instant event_created_date, java.util.Map event_properties); + method public app.cash.sqldelight.Query searchEvents(String query); + method public app.cash.sqldelight.Query searchEvents(String query, kotlin.jvm.functions.Function6,? extends T> mapper); + } + +} + package com.addhen.kanalytics.viewer.app.shared.data.model { public final class EventData { - ctor public EventData(Long? id, String name, String trackerName, String? description, kotlinx.datetime.Instant createdAt, java.util.Map properties); - method public kotlinx.datetime.Instant getCreatedAt(); - method public String? getDescription(); - method public Long? getId(); - method public String getName(); - method public java.util.Map getProperties(); - method public String getTrackerName(); - property public final kotlinx.datetime.Instant createdAt; - property public final String? description; - property public final Long? id; - property public final String name; - property public final java.util.Map properties; - property public final String trackerName; + ctor public EventData(Long? id, String name, String trackerName, String? description, kotlin.time.Instant createdAt, java.util.Map properties); + method @InaccessibleFromKotlin public kotlin.time.Instant getCreatedAt(); + method @InaccessibleFromKotlin public String? getDescription(); + method @InaccessibleFromKotlin public Long? getId(); + method @InaccessibleFromKotlin public String getName(); + method @InaccessibleFromKotlin public java.util.Map getProperties(); + method @InaccessibleFromKotlin public String getTrackerName(); + property public kotlin.time.Instant createdAt; + property public String? description; + property public Long? id; + property public String name; + property public java.util.Map properties; + property public String trackerName; } } @@ -129,7 +188,7 @@ package com.addhen.kanalytics.viewer.app.shared.data.repository { public final class EventDataRepository implements com.addhen.kanalytics.viewer.app.shared.data.repository.EventRepository { ctor public EventDataRepository(com.addhen.kanalytics.viewer.app.shared.data.database.EventDataDao eventDataDao); method public suspend Object? deleteAll(kotlin.coroutines.Continuation); - method public suspend Object? deleteAllOlderThan(kotlinx.datetime.Instant date, kotlin.coroutines.Continuation); + method public suspend Object? deleteAllOlderThan(kotlin.time.Instant date, kotlin.coroutines.Continuation); method public kotlinx.coroutines.flow.Flow> getAll(); method public kotlinx.coroutines.flow.Flow getEventById(long id); method public suspend Object? insert(com.addhen.kanalytics.viewer.app.shared.data.model.EventData eventData, kotlin.coroutines.Continuation); @@ -138,7 +197,7 @@ package com.addhen.kanalytics.viewer.app.shared.data.repository { public interface EventRepository { method public suspend Object? deleteAll(kotlin.coroutines.Continuation); - method public suspend Object? deleteAllOlderThan(kotlinx.datetime.Instant date, kotlin.coroutines.Continuation); + method public suspend Object? deleteAllOlderThan(kotlin.time.Instant date, kotlin.coroutines.Continuation); method public kotlinx.coroutines.flow.Flow> getAll(); method public kotlinx.coroutines.flow.Flow getEventById(long id); method public suspend Object? insert(com.addhen.kanalytics.viewer.app.shared.data.model.EventData eventData, kotlin.coroutines.Continuation); @@ -158,11 +217,11 @@ package com.addhen.kanalytics.viewer.app.shared.ui { } public final class ViewerAppKt { - method @androidx.compose.runtime.Composable public static void ViewerApp(optional androidx.navigation.NavHostController navController); + method @KotlinOnly @androidx.compose.runtime.Composable public static void ViewerApp(optional androidx.navigation.NavHostController navController); } public final class ViewerAppScaffoldKt { - method @androidx.compose.runtime.Composable public static void ViewerAppScaffold(String title, optional kotlin.jvm.functions.Function0 navigationIcon, optional kotlin.jvm.functions.Function1 actions, optional kotlin.jvm.functions.Function0 searchTopBar, optional kotlin.jvm.functions.Function0 topBar, androidx.compose.material3.SnackbarHostState snackbarHostState, kotlin.jvm.functions.Function1 content); + method @KotlinOnly @androidx.compose.runtime.Composable public static void ViewerAppScaffold(String title, optional kotlin.jvm.functions.Function0 navigationIcon, optional kotlin.jvm.functions.Function1 actions, optional kotlin.jvm.functions.Function0 searchTopBar, optional kotlin.jvm.functions.Function0 topBar, androidx.compose.material3.SnackbarHostState snackbarHostState, kotlin.jvm.functions.Function1 content); } } @@ -170,21 +229,21 @@ package com.addhen.kanalytics.viewer.app.shared.ui { package com.addhen.kanalytics.viewer.app.shared.ui.component { public final class AppSnackbarHostKt { - method @androidx.compose.runtime.Composable public static void AppSnackbarHost(androidx.compose.material3.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1 snackbar); + method @KotlinOnly @androidx.compose.runtime.Composable public static void AppSnackbarHost(androidx.compose.material3.SnackbarHostState hostState, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function1 snackbar); } public final class AppSurfaceKt { - method @androidx.compose.runtime.Composable public static void AppSurface(kotlin.jvm.functions.Function0 appNavHost); + method @KotlinOnly @androidx.compose.runtime.Composable public static void AppSurface(kotlin.jvm.functions.Function0 appNavHost); } public final class EmptyKt { - method @androidx.compose.runtime.Composable public static void EmptyContent(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0 title); + method @KotlinOnly @androidx.compose.runtime.Composable public static void EmptyContent(optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function0 title); } public final class PreferenceKt { - method @androidx.compose.runtime.Composable public static void CheckboxPreference(boolean checked, kotlin.jvm.functions.Function0 onCheckClicked, String title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onClick, optional kotlin.jvm.functions.Function0? beforeControl, optional String? summaryOff, optional String? summaryOn); - method @androidx.compose.runtime.Composable public static void Preference(String title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onClick, optional kotlin.jvm.functions.Function0? summary, optional kotlin.jvm.functions.Function1? control); - method @androidx.compose.runtime.Composable public static void PreferenceHeader(String title, optional androidx.compose.ui.Modifier modifier, optional float tonalElevation); + method @KotlinOnly @androidx.compose.runtime.Composable public static void CheckboxPreference(boolean checked, kotlin.jvm.functions.Function0 onCheckClicked, String title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onClick, optional kotlin.jvm.functions.Function0? beforeControl, optional String? summaryOff, optional String? summaryOn); + method @KotlinOnly @androidx.compose.runtime.Composable public static void Preference(String title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0 onClick, optional kotlin.jvm.functions.Function0? summary, optional kotlin.jvm.functions.Function1? control); + method @KotlinOnly @androidx.compose.runtime.Composable public static void PreferenceHeader(String title, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.unit.Dp tonalElevation); } } @@ -192,7 +251,7 @@ package com.addhen.kanalytics.viewer.app.shared.ui.component { package com.addhen.kanalytics.viewer.app.shared.ui.eventlist { public final class EventViewerScreenKt { - method @androidx.compose.runtime.Composable public static void EventViewerScreen(kotlin.jvm.functions.Function0 navigateToSettings, kotlin.jvm.functions.Function2 onNavigateToDetail); + method @KotlinOnly @androidx.compose.runtime.Composable public static void EventViewerScreen(kotlin.jvm.functions.Function0 navigateToSettings, kotlin.jvm.functions.Function2 onNavigateToDetail); } } @@ -200,7 +259,7 @@ package com.addhen.kanalytics.viewer.app.shared.ui.eventlist { package com.addhen.kanalytics.viewer.app.shared.ui.navigation { public final class NavGraphKt { - method @androidx.compose.runtime.Composable public static void AppNavGraph(androidx.navigation.NavHostController navController, kotlin.reflect.KClass startDestination); + method @KotlinOnly @androidx.compose.runtime.Composable public static void AppNavGraph(androidx.navigation.NavHostController navController, kotlin.reflect.KClass startDestination); method public static androidx.navigation.NavOptions buildNavOptions(androidx.navigation.NavController); } @@ -210,8 +269,8 @@ package com.addhen.kanalytics.viewer.app.shared.ui.settings { public interface Preference { method public suspend Object? get(kotlin.coroutines.Continuation); - method public T getDefaultValue(); - method public kotlinx.coroutines.flow.Flow getFlow(); + method @InaccessibleFromKotlin public T getDefaultValue(); + method @InaccessibleFromKotlin public kotlinx.coroutines.flow.Flow getFlow(); method public suspend Object? set(T value, kotlin.coroutines.Continuation); property public abstract T defaultValue; property public abstract kotlinx.coroutines.flow.Flow flow; @@ -222,15 +281,13 @@ package com.addhen.kanalytics.viewer.app.shared.ui.settings { } public interface ViewerAppPreferences { - method public com.addhen.kanalytics.viewer.app.shared.ui.settings.Preference getTheme(); - method public com.addhen.kanalytics.viewer.app.shared.ui.settings.Preference getUseDynamicColors(); + method @InaccessibleFromKotlin public com.addhen.kanalytics.viewer.app.shared.ui.settings.Preference getTheme(); + method @InaccessibleFromKotlin public com.addhen.kanalytics.viewer.app.shared.ui.settings.Preference getUseDynamicColors(); property public abstract com.addhen.kanalytics.viewer.app.shared.ui.settings.Preference theme; property public abstract com.addhen.kanalytics.viewer.app.shared.ui.settings.Preference useDynamicColors; } public enum ViewerAppPreferences.Theme { - method public static com.addhen.kanalytics.viewer.app.shared.ui.settings.ViewerAppPreferences.Theme valueOf(String value) throws java.lang.IllegalArgumentException, java.lang.NullPointerException; - method public static com.addhen.kanalytics.viewer.app.shared.ui.settings.ViewerAppPreferences.Theme[] values(); enum_constant public static final com.addhen.kanalytics.viewer.app.shared.ui.settings.ViewerAppPreferences.Theme DARK; enum_constant public static final com.addhen.kanalytics.viewer.app.shared.ui.settings.ViewerAppPreferences.Theme LIGHT; enum_constant public static final com.addhen.kanalytics.viewer.app.shared.ui.settings.ViewerAppPreferences.Theme SYSTEM; diff --git a/kanalytics-viewer/build.gradle.kts b/kanalytics-viewer/build.gradle.kts index aabf7bae..f1e17737 100644 --- a/kanalytics-viewer/build.gradle.kts +++ b/kanalytics-viewer/build.gradle.kts @@ -3,7 +3,7 @@ plugins { - id("convention.plugin.android.library") + alias(libs.plugins.androidKmpLibrary) id("convention.plugin.kotlin.multiplatform") alias(libs.plugins.dokka) id("convention.plugin.maven.publication") @@ -12,10 +12,18 @@ plugins { alias(libs.plugins.kotlin.serialization) alias(libs.plugins.sqldelight) alias(libs.plugins.mokkery) - alias(libs.plugins.androidx.baselineprofile) } kotlin { + android { + namespace = "com.addhen.kanalytics.viewer" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + androidResources { + enable = true + } + } + sourceSets { commonMain { dependencies { @@ -29,6 +37,7 @@ kotlin { implementation(libs.kotlinx.datetime) implementation(libs.touchlab.kermit) implementation(libs.lifecycle.viewmodel.compose) + implementation(libs.lifecycle.runtime.compose) implementation(libs.androidx.navigation.compose) implementation(libs.kotlinx.serialization) implementation(libs.sqldelight.coroutines) @@ -64,31 +73,6 @@ kotlin { } } -android { - namespace = "com.addhen.kanalytics.viewer" - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - unitTests { - isIncludeAndroidResources = true - } - } - - dependencies { - baselineProfile(projects.kanalyticsViewerBaseProfile) - } - - baselineProfile { - mergeIntoMain = true - saveInSrc = true - filter { - include("com.addhen.kanalytics.viewer.**") - } - } -} - sqldelight { databases { create("EventViewerDatabase") { diff --git a/kanalytics-viewer/src/androidMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/ColorScheme.android.kt b/kanalytics-viewer/src/androidMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/ColorScheme.android.kt index 22f088fb..4d77179c 100644 --- a/kanalytics-viewer/src/androidMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/ColorScheme.android.kt +++ b/kanalytics-viewer/src/androidMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/ColorScheme.android.kt @@ -16,9 +16,12 @@ internal actual fun colorScheme(useDarkColors: Boolean, useDynamicColors: Boolea Build.VERSION.SDK_INT >= 31 && useDynamicColors && useDarkColors -> { dynamicDarkColorScheme(LocalContext.current) } + Build.VERSION.SDK_INT >= 31 && useDynamicColors && !useDarkColors -> { dynamicLightColorScheme(LocalContext.current) } + useDarkColors -> lightScheme + else -> darkScheme } diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt index 6c53dfc7..b1fd6aa6 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/data/model/EventData.kt @@ -1,6 +1,8 @@ // Copyright 2024, Addhen Ltd and the kanalytics project contributors // SPDX-License-Identifier: Apache-2.0 +@file:OptIn(kotlin.time.ExperimentalTime::class) + package com.addhen.kanalytics.viewer.app.shared.data.model import kotlin.time.Instant diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt index c22e88cf..b7c90ba2 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/Instant.kt @@ -3,12 +3,14 @@ import kotlin.time.Instant import kotlinx.datetime.TimeZone +import kotlinx.datetime.toInstant import kotlinx.datetime.toLocalDateTime +@OptIn(kotlin.time.ExperimentalTime::class) internal fun Instant.toFormattedString( timezone: TimeZone = TimeZone.currentSystemDefault(), ): String { - val localDateTime = this.toLocalDateTime(timezone) + val localDateTime = kotlinx.datetime.Instant.parse(this.toString()).toLocalDateTime(timezone) return buildString { append(localDateTime.year.toString().padStart(4, '0')) append('-') diff --git a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/Theme.kt b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/Theme.kt index f119d7f9..3ca87d99 100644 --- a/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/Theme.kt +++ b/kanalytics-viewer/src/commonMain/kotlin/com/addhen/kanalytics/viewer/app/shared/ui/theme/Theme.kt @@ -152,6 +152,7 @@ internal fun eventHeaderTextColor(isDarkTheme: Boolean = isSystemInDarkTheme()) @Composable internal fun eventNameTextColor(isDarkTheme: Boolean = isSystemInDarkTheme()) = when { isDarkTheme -> EventNameColorScheme.Dark.textColor + else -> { EventNameColorScheme.Light.textColor } @@ -160,6 +161,7 @@ internal fun eventNameTextColor(isDarkTheme: Boolean = isSystemInDarkTheme()) = @Composable internal fun eventPropertiesTextColor(isDarkTheme: Boolean = isSystemInDarkTheme()) = when { isDarkTheme -> EventPropertiesColorScheme.Dark.textColor + else -> { EventPropertiesColorScheme.Light.textColor } @@ -180,7 +182,9 @@ internal fun jsonTreeTextColor(isDarkTheme: Boolean = isSystemInDarkTheme()) = w highlightColor = searchHighlightDark, selectedHighlightColor = searchHighlightDark, ) - } else -> { + } + + else -> { TreeColors( keyColor = defaultLightColors.keyColor, stringValueColor = defaultLightColors.stringValueColor, diff --git a/kanalytics-viewer/src/iosMain/kotlin/com/addhen/kanalytics/viewer/LaunchViewerApp.ios.kt b/kanalytics-viewer/src/iosMain/kotlin/com/addhen/kanalytics/viewer/LaunchViewerApp.ios.kt index f9549e2a..a6eda48b 100644 --- a/kanalytics-viewer/src/iosMain/kotlin/com/addhen/kanalytics/viewer/LaunchViewerApp.ios.kt +++ b/kanalytics-viewer/src/iosMain/kotlin/com/addhen/kanalytics/viewer/LaunchViewerApp.ios.kt @@ -38,6 +38,7 @@ private fun getTopMostViewController( return when (base) { is UINavigationController -> getTopMostViewController(base.visibleViewController) + is UITabBarController -> { base.selectedViewController?.let { getTopMostViewController(it) } } diff --git a/kanalytics/api/api.txt b/kanalytics/api/api.txt index 9b105833..2787e34f 100644 --- a/kanalytics/api/api.txt +++ b/kanalytics/api/api.txt @@ -7,11 +7,10 @@ package com.addhen.kanalytics { } public static interface Interceptor.Chain { - method public com.addhen.kanalytics.KAnalyticsEvent getEvent(); - method public String getKTrackerName(); + method @InaccessibleFromKotlin public com.addhen.kanalytics.KAnalyticsEvent getEvent(); method public com.addhen.kanalytics.KAnalyticsEvent proceed(com.addhen.kanalytics.KAnalyticsEvent event); property public abstract com.addhen.kanalytics.KAnalyticsEvent event; - property public abstract String kTrackerName; + property public abstract com.addhen.kanalytics.KTrackerName kTrackerName; } public static final class Interceptor.Companion { @@ -20,6 +19,7 @@ package com.addhen.kanalytics { public final class KAnalytics { ctor public KAnalytics(); + method public com.addhen.kanalytics.KAnalytics enabled(boolean enabled); method public com.addhen.kanalytics.KAnalytics.Builder newBuilder(); method public void send(com.addhen.kanalytics.KAnalyticsEvent event); method public void send(com.addhen.kanalytics.KAnalyticsEvent event, kotlin.reflect.KClass... kTrackerNames); @@ -31,19 +31,24 @@ package com.addhen.kanalytics { method public com.addhen.kanalytics.KAnalytics.Builder addInterceptor(com.addhen.kanalytics.Interceptor interceptor); method public com.addhen.kanalytics.KAnalytics.Builder addTracker(com.addhen.kanalytics.KTracker kTracker); method public com.addhen.kanalytics.KAnalytics build(); + method public com.addhen.kanalytics.KAnalytics.Builder enabled(boolean enabled); } public final class KAnalyticsEvent { - ctor public KAnalyticsEvent(String eventName, optional String? eventDescription, optional java.util.Map properties); - method public com.addhen.kanalytics.KAnalyticsEvent addProperties(java.util.Map map); + ctor public KAnalyticsEvent(String eventName, optional String? eventDescription, optional java.util.Map properties, optional java.util.Map userProperties); + method public com.addhen.kanalytics.KAnalyticsEvent addProperties(java.util.Map map); method public com.addhen.kanalytics.KAnalyticsEvent addProperty(String propertyName, Object? value); - method public com.addhen.kanalytics.KAnalyticsEvent copy(optional String eventName, optional String? eventDescription, optional java.util.Map properties); - method public String? getEventDescription(); - method public String getEventName(); - method public java.util.Map getProperties(); - property public final String? eventDescription; - property public final String eventName; - property public final java.util.Map properties; + method public com.addhen.kanalytics.KAnalyticsEvent addUserProperties(java.util.Map map); + method public com.addhen.kanalytics.KAnalyticsEvent addUserProperty(String propertyName, Object? value); + method public com.addhen.kanalytics.KAnalyticsEvent copy(optional String eventName, optional String? eventDescription, optional java.util.Map properties, optional java.util.Map userProperties); + method @InaccessibleFromKotlin public String? getEventDescription(); + method @InaccessibleFromKotlin public String getEventName(); + method @InaccessibleFromKotlin public java.util.Map getProperties(); + method @InaccessibleFromKotlin public java.util.Map getUserProperties(); + property public String? eventDescription; + property public String eventName; + property public java.util.Map properties; + property public java.util.Map userProperties; } public interface KTracker { @@ -51,9 +56,9 @@ package com.addhen.kanalytics { } @kotlin.jvm.JvmInline public final value class KTrackerName { - ctor public KTrackerName(String value); - method public String getValue(); - property public final String value; + ctor @KotlinOnly public KTrackerName(String value); + method @InaccessibleFromKotlin public String getValue(); + property public String value; } } diff --git a/kanalytics/build.gradle.kts b/kanalytics/build.gradle.kts index 96f561a1..655c707d 100644 --- a/kanalytics/build.gradle.kts +++ b/kanalytics/build.gradle.kts @@ -3,7 +3,7 @@ plugins { - id("convention.plugin.android.library") + alias(libs.plugins.androidKmpLibrary) id("convention.plugin.kotlin.multiplatform") alias(libs.plugins.dokka) id("convention.plugin.maven.publication") @@ -11,6 +11,12 @@ plugins { } kotlin { + android { + namespace = "com.addhen.kanalytics" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + } + sourceSets { commonMain { dependencies { @@ -28,19 +34,6 @@ kotlin { } } -android { - namespace = "com.addhen.kanalytics" - defaultConfig { - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } - - testOptions { - unitTests { - isIncludeAndroidResources = true - } - } -} - publishing { // Configure all publications publications.withType { diff --git a/sample/android/build.gradle.kts b/sample/android/build.gradle.kts index be75224a..25e51083 100644 --- a/sample/android/build.gradle.kts +++ b/sample/android/build.gradle.kts @@ -6,9 +6,6 @@ plugins { id("convention.plugin.android.application") id("convention.plugin.kotlin.android") id("convention.plugin.compose") - alias(libs.plugins.kotlin.android) - alias(libs.plugins.android.application) - alias(libs.plugins.androidx.baselineprofile) } android { @@ -61,8 +58,3 @@ dependencies { implementation(libs.androidx.navigation.compose) implementation(libs.androidx.profileinstaller) } - -baselineProfile { - mergeIntoMain = true - saveInSrc = true -} diff --git a/sample/ios-framework/build.gradle.kts b/sample/ios-framework/build.gradle.kts index be0964fc..8889419a 100644 --- a/sample/ios-framework/build.gradle.kts +++ b/sample/ios-framework/build.gradle.kts @@ -7,16 +7,18 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget // Copyright 2024, Addhen Ltd and the k-location project contributors // SPDX-License-Identifier: Apache-2.0 plugins { - id("convention.plugin.android.library") + alias(libs.plugins.androidKmpLibrary) id("convention.plugin.kotlin.multiplatform") id("convention.plugin.compose") } -android { - namespace = "com.addhen.kanaltyics.sample.iosframework" -} - kotlin { + android { + namespace = "com.addhen.kanaltyics.sample.iosframework" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + } + val isDebug = project.extra["kanalytics.sampleDebug"] == "debug" sourceSets { commonMain { diff --git a/sample/shared/build.gradle.kts b/sample/shared/build.gradle.kts index 3788b55c..ffe41b6a 100644 --- a/sample/shared/build.gradle.kts +++ b/sample/shared/build.gradle.kts @@ -3,17 +3,19 @@ plugins { - id("convention.plugin.android.library") + alias(libs.plugins.androidKmpLibrary) id("convention.plugin.kotlin.multiplatform") id("convention.plugin.compose") alias(libs.plugins.kotlin.serialization) } -android { - namespace = "com.addhen.kanalytics.sample.shared" -} - kotlin { + android { + namespace = "com.addhen.kanalytics.sample.shared" + compileSdk = libs.versions.compileSdk.get().toInt() + minSdk = libs.versions.minSdk.get().toInt() + } + val isDebug = project.extra["kanalytics.sampleDebug"] == "debug" sourceSets { commonMain { @@ -30,6 +32,7 @@ kotlin { implementation(compose.components.resources) implementation(libs.kotlinx.datetime) implementation(libs.lifecycle.viewmodel.compose) + implementation(libs.lifecycle.runtime.compose) implementation(libs.androidx.navigation.compose) implementation(libs.kotlinx.serialization) implementation(libs.kotlinx.serialization) diff --git a/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleScreen.kt b/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleScreen.kt index ef8f90a3..f8a71ace 100644 --- a/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleScreen.kt +++ b/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleScreen.kt @@ -20,6 +20,7 @@ public fun SampleScreen(modifier: Modifier, onEventViewerTrigger: () -> Unit) { when (uiState.flag) { SampleViewModel.LocationUiState.Flag.LOADING -> FullScreenLoading() + SampleViewModel.LocationUiState.Flag.IDLE -> { Sample( modifier, diff --git a/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleViewModel.kt b/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleViewModel.kt index cffca8d0..09e96005 100644 --- a/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleViewModel.kt +++ b/sample/shared/src/commonMain/kotlin/com.addhen.kanalytics.sample.shared/SampleViewModel.kt @@ -45,6 +45,7 @@ public class SampleViewModel(private val kanalytics: KAnalytics) : ViewModel() { .map { action -> when (action) { is UiAction.TriggerAnalyticsEvent -> sendAnalyticsEvent() + is UiAction.LoadEvent -> { // do nothing }