diff --git a/.github/workflows/publish_android.yml b/.github/workflows/publish_android.yml index 818991a0..f678b120 100644 --- a/.github/workflows/publish_android.yml +++ b/.github/workflows/publish_android.yml @@ -17,7 +17,7 @@ jobs: distribution: 'zulu' java-version: 21 - name: Publish to MavenCentral - run: ./gradlew :core:publishToMavenCentral :okhttp-interceptor:publishToMavenCentral :grpc-interceptor:publishToMavenCentral --no-configuration-cache + run: ./gradlew :flocon-base:publishToMavenCentral :flocon:publishToMavenCentral :flocon-no-op:publishToMavenCentral :okhttp-interceptor:publishToMavenCentral :grpc-interceptor:publishToMavenCentral --no-configuration-cache working-directory: FloconAndroid env: PROJECT_VERSION_NAME: ${{ github.ref_name }} diff --git a/FloconAndroid/.idea/gradle.xml b/FloconAndroid/.idea/gradle.xml index 4140775b..63d05ec4 100644 --- a/FloconAndroid/.idea/gradle.xml +++ b/FloconAndroid/.idea/gradle.xml @@ -11,7 +11,9 @@ diff --git a/FloconAndroid/app/build.gradle.kts b/FloconAndroid/app/build.gradle.kts index b44a52a0..8f6b7a65 100644 --- a/FloconAndroid/app/build.gradle.kts +++ b/FloconAndroid/app/build.gradle.kts @@ -46,12 +46,14 @@ android { val useMaven = false dependencies { if(useMaven) { - val floconVersion = "1.0.3" + val floconVersion = "1.0.5" implementation("io.github.openflocon:flocon:$floconVersion") + //implementation("io.github.openflocon:flocon-no-op:$floconVersion") implementation("io.github.openflocon:flocon-grpc-interceptor:$floconVersion") implementation("io.github.openflocon:flocon-okhttp-interceptor:$floconVersion") } else { - implementation(project(":core")) + //implementation(project(":flocon")) + implementation(project(":flocon-no-op")) implementation(project(":okhttp-interceptor")) implementation(project(":grpc-interceptor")) } diff --git a/FloconAndroid/app/src/main/java/io/github/openflocon/flocon/myapplication/MainActivity.kt b/FloconAndroid/app/src/main/java/io/github/openflocon/flocon/myapplication/MainActivity.kt index 1beb43a0..6d77789e 100644 --- a/FloconAndroid/app/src/main/java/io/github/openflocon/flocon/myapplication/MainActivity.kt +++ b/FloconAndroid/app/src/main/java/io/github/openflocon/flocon/myapplication/MainActivity.kt @@ -31,8 +31,6 @@ import io.github.openflocon.flocon.okhttp.FloconOkhttpInterceptor import io.github.openflocon.flocon.plugins.analytics.analytics import io.github.openflocon.flocon.plugins.analytics.model.AnalyticsEvent import io.github.openflocon.flocon.plugins.analytics.model.analyticsProperty -import io.github.openflocon.flocon.plugins.deeplinks.deeplinks -import io.github.openflocon.flocon.plugins.deeplinks.model.Deeplink import io.github.openflocon.flocon.plugins.tables.model.toParam import io.github.openflocon.flocon.plugins.tables.table import kotlinx.coroutines.GlobalScope diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt b/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt deleted file mode 100644 index 852a93dd..00000000 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.openflocon.flocon.model - -import io.github.openflocon.flocon.FloconLogger -import org.json.JSONObject - -data class FloconMessageFromServer( - val plugin: String, - val method: String, - val body: String, -) { - companion object { - fun fromJson( - message: String, - ): FloconMessageFromServer? { - return try { - val jsonObject = JSONObject(message) - - FloconMessageFromServer( - plugin = jsonObject.getString("plugin"), - method = jsonObject.getString("method"), - body = jsonObject.getString("body"), - ) - } catch (t: Throwable) { - FloconLogger.logError("parsing issue", t) - null - } - } - - } -} diff --git a/FloconAndroid/core/.gitignore b/FloconAndroid/flocon-base/.gitignore similarity index 100% rename from FloconAndroid/core/.gitignore rename to FloconAndroid/flocon-base/.gitignore diff --git a/FloconAndroid/flocon-base/build.gradle.kts b/FloconAndroid/flocon-base/build.gradle.kts new file mode 100644 index 00000000..6a826578 --- /dev/null +++ b/FloconAndroid/flocon-base/build.gradle.kts @@ -0,0 +1,82 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + id("com.vanniktech.maven.publish") version "0.34.0" +} + +android { + namespace = "io.github.openflocon.flocon.base" + compileSdk = 36 + + defaultConfig { + minSdk = 24 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } +} + +dependencies { + implementation(platform(libs.kotlinx.coroutines.bom)) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.coroutines.android) +} + +mavenPublishing { + publishToMavenCentral(automaticRelease = true) + + if (project.hasProperty("signing.required") && project.property("signing.required") == "false") { + // Skip signing + } else { + signAllPublications() + } + + coordinates( + groupId = project.property("floconGroupId") as String, + artifactId = "flocon-base", + version = System.getenv("PROJECT_VERSION_NAME") ?: project.property("floconVersion") as String + ) + + pom { + name = "Flocon" + description = project.property("floconDescription") as String + inceptionYear = "2025" + url = "https://github.com/openflocon/Flocon" + licenses { + license { + name = "The Apache License, Version 2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0.txt" + distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + developers { + developer { + id = "openflocon" + name = "Open Flocon" + url = "https://github.com/openflocon" + } + } + scm { + url = "https://github.com/openflocon/Flocon" + connection = "scm:git:git://github.com/openflocon/Flocon.git" + developerConnection = "scm:git:ssh://git@github.com/openflocon/Flocon.git" + } + } +} \ No newline at end of file diff --git a/FloconAndroid/core/consumer-rules.pro b/FloconAndroid/flocon-base/consumer-rules.pro similarity index 100% rename from FloconAndroid/core/consumer-rules.pro rename to FloconAndroid/flocon-base/consumer-rules.pro diff --git a/FloconAndroid/core/proguard-rules.pro b/FloconAndroid/flocon-base/proguard-rules.pro similarity index 100% rename from FloconAndroid/core/proguard-rules.pro rename to FloconAndroid/flocon-base/proguard-rules.pro diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/FloconApp.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/FloconApp.kt new file mode 100644 index 00000000..c214ce12 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/FloconApp.kt @@ -0,0 +1,41 @@ +package io.github.openflocon.flocon + +import android.content.Context +import io.github.openflocon.flocon.core.FloconMessageSender +import io.github.openflocon.flocon.plugins.analytics.FloconAnalyticsPlugin +import io.github.openflocon.flocon.plugins.dashboard.FloconDashboardPlugin +import io.github.openflocon.flocon.plugins.deeplinks.FloconDeeplinksPlugin +import io.github.openflocon.flocon.plugins.network.FloconNetworkPlugin +import io.github.openflocon.flocon.plugins.tables.FloconTablePlugin +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow + +abstract class FloconApp { + + companion object { + var instance: FloconApp? = null + private set + } + + interface Client : FloconMessageSender { + + @Throws(Throwable::class) + suspend fun connect(onClosed: () -> Unit) + fun disconnect() + + val dashboardPlugin: FloconDashboardPlugin + val tablePlugin: FloconTablePlugin + val deeplinksPlugin: FloconDeeplinksPlugin + val analyticsPlugin: FloconAnalyticsPlugin + val networkPlugin: FloconNetworkPlugin + } + + open val client: FloconApp.Client? = null + + abstract val isInitialized : StateFlow + + open fun initialize(context: Context) { + instance = this + } + +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/FloconLogger.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/FloconLogger.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/FloconLogger.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/FloconLogger.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/core/FloconMessageSender.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/core/FloconMessageSender.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/core/FloconMessageSender.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/core/FloconMessageSender.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/core/FloconPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/core/FloconPlugin.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/core/FloconPlugin.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/core/FloconPlugin.kt diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt new file mode 100644 index 00000000..3cd9651c --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt @@ -0,0 +1,7 @@ +package io.github.openflocon.flocon.model + +data class FloconMessageFromServer( + val plugin: String, + val method: String, + val body: String, +) \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt new file mode 100644 index 00000000..e663c09c --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt @@ -0,0 +1,17 @@ +package io.github.openflocon.flocon.plugins.analytics + +import io.github.openflocon.flocon.FloconApp +import io.github.openflocon.flocon.core.FloconPlugin +import io.github.openflocon.flocon.plugins.analytics.builder.AnalyticsBuilder +import io.github.openflocon.flocon.plugins.analytics.model.AnalyticsItem + +fun FloconApp.analytics(analyticsName: String): AnalyticsBuilder { + return AnalyticsBuilder( + analyticsTableId = analyticsName, + analyticsPlugin = this.client?.analyticsPlugin, + ) +} + +interface FloconAnalyticsPlugin : FloconPlugin { + fun registerAnalytics(analyticsItems: List) +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/builder/AnalyticsBuilder.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/builder/AnalyticsBuilder.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/builder/AnalyticsBuilder.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/builder/AnalyticsBuilder.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsEvent.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsEvent.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsEvent.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsEvent.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsPropertiesConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsPropertiesConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsPropertiesConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/AnalyticsPropertiesConfig.kt diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/TableItem.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/TableItem.kt new file mode 100644 index 00000000..f1150762 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/TableItem.kt @@ -0,0 +1,9 @@ +package io.github.openflocon.flocon.plugins.analytics.model + +data class AnalyticsItem( + val id: String, + val analyticsTableId: String, + val eventName: String, + val createdAt: Long, + val properties: List, +) \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt new file mode 100644 index 00000000..b960aaae --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt @@ -0,0 +1,20 @@ +package io.github.openflocon.flocon.plugins.dashboard + +import io.github.openflocon.flocon.FloconApp +import io.github.openflocon.flocon.core.FloconPlugin +import io.github.openflocon.flocon.plugins.dashboard.dsl.DashboardBuilder +import io.github.openflocon.flocon.plugins.dashboard.dsl.dashboardConfig +import io.github.openflocon.flocon.plugins.dashboard.model.DashboardConfig + + +fun FloconApp.dashboard(id: String, block: DashboardBuilder.() -> Unit) { + this.client?.dashboardPlugin?.let { + // on no op, this callback is never called + val dashboardConfig = dashboardConfig(id = id, block) + it.registerDashboard(dashboardConfig) + } +} + +interface FloconDashboardPlugin : FloconPlugin { + fun registerDashboard(dashboardConfig: DashboardConfig) +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/ButtonDsl.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/ButtonDsl.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/ButtonDsl.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/ButtonDsl.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/CheckBox.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/CheckBox.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/CheckBox.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/CheckBox.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardBuilder.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardBuilder.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardBuilder.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardBuilder.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardDsl.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardDsl.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardDsl.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/DashboardDsl.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/PlainTextDsl.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/PlainTextDsl.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/PlainTextDsl.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/PlainTextDsl.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/SectionDsl.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/SectionDsl.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/SectionDsl.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/SectionDsl.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextDsl.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextDsl.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextDsl.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextDsl.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextField.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextField.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextField.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/dsl/TextField.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/Dashboard.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/Dashboard.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/Dashboard.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/Dashboard.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ButtonConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ButtonConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ButtonConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ButtonConfig.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/CheckBoxConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/CheckBoxConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/CheckBoxConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/CheckBoxConfig.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ElementConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ElementConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ElementConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/ElementConfig.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/PlainTextConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/PlainTextConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/PlainTextConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/PlainTextConfig.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionBuilder.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionBuilder.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionBuilder.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionBuilder.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/SectionConfig.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextConfig.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextFieldConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextFieldConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextFieldConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/config/TextFieldConfig.kt diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt new file mode 100644 index 00000000..ce9c64f0 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt @@ -0,0 +1,6 @@ +package io.github.openflocon.flocon.plugins.database + +import io.github.openflocon.flocon.core.FloconPlugin + + +interface FloconDatabasePlugin : FloconPlugin \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt new file mode 100644 index 00000000..0e53b429 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt @@ -0,0 +1,13 @@ +package io.github.openflocon.flocon.plugins.deeplinks + +import io.github.openflocon.flocon.FloconApp +import io.github.openflocon.flocon.core.FloconPlugin +import io.github.openflocon.flocon.plugins.deeplinks.model.Deeplink + +fun FloconApp.deeplinks(deeplinks: List) { + this.client?.deeplinksPlugin?.registerDeeplinks(deeplinks) +} + +interface FloconDeeplinksPlugin : FloconPlugin { + fun registerDeeplinks(deeplinks: List) +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/model/Deeplink.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/model/Deeplink.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/model/Deeplink.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/model/Deeplink.kt diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt new file mode 100644 index 00000000..348ebc6d --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt @@ -0,0 +1,5 @@ +package io.github.openflocon.flocon.plugins.files + +import io.github.openflocon.flocon.core.FloconPlugin + +interface FloconFilesPlugin : FloconPlugin \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPlugin.kt new file mode 100644 index 00000000..47dcad37 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPlugin.kt @@ -0,0 +1,8 @@ +package io.github.openflocon.flocon.plugins.network + +import io.github.openflocon.flocon.core.FloconPlugin +import io.github.openflocon.flocon.plugins.network.model.FloconNetworkRequest + +interface FloconNetworkPlugin : FloconPlugin { + fun log(call: FloconNetworkRequest) +} \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt new file mode 100644 index 00000000..55a89adf --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt @@ -0,0 +1,26 @@ +package io.github.openflocon.flocon.plugins.network.model + +data class FloconNetworkRequest( + val request: Request, + val response: Response, + val durationMs: Double, + val floconNetworkType: String, +) { + data class Request( + val url: String, + val method: String, + val startTime: Long, + val headers: Map, + val body: String?, + val size: Long?, + ) + + data class Response( + val httpCode: Int?, + val grpcStatus: String?, + val contentType: String?, + val body: String?, + val size: Long?, + val headers: Map, + ) +} \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt new file mode 100644 index 00000000..b251c9c2 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt @@ -0,0 +1,5 @@ +package io.github.openflocon.flocon.plugins.SharedPreferences + +import io.github.openflocon.flocon.core.FloconPlugin + +interface FloconSharedPreferencesPlugin : FloconPlugin \ No newline at end of file diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt new file mode 100644 index 00000000..2b3d05c1 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt @@ -0,0 +1,17 @@ +package io.github.openflocon.flocon.plugins.tables + +import io.github.openflocon.flocon.FloconApp +import io.github.openflocon.flocon.core.FloconPlugin +import io.github.openflocon.flocon.plugins.tables.builder.TableBuilder +import io.github.openflocon.flocon.plugins.tables.model.TableItem + +fun FloconApp.table(tableName: String): TableBuilder { + return TableBuilder( + tableName = tableName, + tablePlugin = this.client?.tablePlugin, + ) +} + +interface FloconTablePlugin : FloconPlugin { + fun registerTable(tableItem: TableItem) +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/builder/TableBuilder.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/builder/TableBuilder.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/builder/TableBuilder.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/builder/TableBuilder.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableColumnConfig.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableColumnConfig.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableColumnConfig.kt rename to FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableColumnConfig.kt diff --git a/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt new file mode 100644 index 00000000..f4635bd9 --- /dev/null +++ b/FloconAndroid/flocon-base/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt @@ -0,0 +1,8 @@ +package io.github.openflocon.flocon.plugins.tables.model + +data class TableItem( + val id: String, + val name: String, + val createdAt: Long, + val columns: List, +) \ No newline at end of file diff --git a/FloconAndroid/flocon-no-op/.gitignore b/FloconAndroid/flocon-no-op/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/FloconAndroid/flocon-no-op/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/FloconAndroid/flocon-no-op/build.gradle.kts b/FloconAndroid/flocon-no-op/build.gradle.kts new file mode 100644 index 00000000..7d1378d1 --- /dev/null +++ b/FloconAndroid/flocon-no-op/build.gradle.kts @@ -0,0 +1,84 @@ +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.kotlin.android) + id("com.vanniktech.maven.publish") version "0.34.0" +} + +android { + namespace = "io.github.openflocon.flocon" + compileSdk = 36 + + defaultConfig { + minSdk = 24 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + kotlinOptions { + jvmTarget = "11" + } +} + +dependencies { + implementation(platform(libs.kotlinx.coroutines.bom)) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.coroutines.android) + + api(project(":flocon-base")) +} + +mavenPublishing { + publishToMavenCentral(automaticRelease = true) + + if (project.hasProperty("signing.required") && project.property("signing.required") == "false") { + // Skip signing + } else { + signAllPublications() + } + + coordinates( + groupId = project.property("floconGroupId") as String, + artifactId = "flocon-no-op", + version = System.getenv("PROJECT_VERSION_NAME") ?: project.property("floconVersion") as String + ) + + pom { + name = "Flocon" + description = project.property("floconDescription") as String + inceptionYear = "2025" + url = "https://github.com/openflocon/Flocon" + licenses { + license { + name = "The Apache License, Version 2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0.txt" + distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + developers { + developer { + id = "openflocon" + name = "Open Flocon" + url = "https://github.com/openflocon" + } + } + scm { + url = "https://github.com/openflocon/Flocon" + connection = "scm:git:git://github.com/openflocon/Flocon.git" + developerConnection = "scm:git:ssh://git@github.com/openflocon/Flocon.git" + } + } +} \ No newline at end of file diff --git a/FloconAndroid/flocon-no-op/consumer-rules.pro b/FloconAndroid/flocon-no-op/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/FloconAndroid/flocon-no-op/proguard-rules.pro b/FloconAndroid/flocon-no-op/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/FloconAndroid/flocon-no-op/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/FloconAndroid/flocon-no-op/src/main/java/io/github/openflocon/flocon/Flocon.kt b/FloconAndroid/flocon-no-op/src/main/java/io/github/openflocon/flocon/Flocon.kt new file mode 100644 index 00000000..132597fc --- /dev/null +++ b/FloconAndroid/flocon-no-op/src/main/java/io/github/openflocon/flocon/Flocon.kt @@ -0,0 +1,7 @@ +package io.github.openflocon.flocon + +import kotlinx.coroutines.flow.MutableStateFlow + +object Flocon : FloconApp() { + override val isInitialized = MutableStateFlow(false) +} \ No newline at end of file diff --git a/FloconAndroid/flocon/.gitignore b/FloconAndroid/flocon/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/FloconAndroid/flocon/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/FloconAndroid/core/build.gradle.kts b/FloconAndroid/flocon/build.gradle.kts similarity index 98% rename from FloconAndroid/core/build.gradle.kts rename to FloconAndroid/flocon/build.gradle.kts index 24f156dc..18c16059 100644 --- a/FloconAndroid/core/build.gradle.kts +++ b/FloconAndroid/flocon/build.gradle.kts @@ -40,6 +40,7 @@ dependencies { implementation(platform(libs.okhttp.bom)) implementation(libs.okhttp) + api(project(":flocon-base")) } mavenPublishing { diff --git a/FloconAndroid/flocon/consumer-rules.pro b/FloconAndroid/flocon/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/FloconAndroid/flocon/proguard-rules.pro b/FloconAndroid/flocon/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/FloconAndroid/flocon/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/FloconAndroid/core/src/main/AndroidManifest.xml b/FloconAndroid/flocon/src/main/AndroidManifest.xml similarity index 100% rename from FloconAndroid/core/src/main/AndroidManifest.xml rename to FloconAndroid/flocon/src/main/AndroidManifest.xml diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/Flocon.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/Flocon.kt similarity index 75% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/Flocon.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/Flocon.kt index 0084eda4..7170d821 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/Flocon.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/Flocon.kt @@ -11,35 +11,34 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch -object Flocon { +object Flocon : FloconApp() { private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - interface Client : FloconMessageSender { + private var _client: FloconApp.Client? = null - @Throws(Throwable::class) - suspend fun connect(onClosed: () -> Unit) - fun disconnect() + override val client: FloconApp.Client? + get() { + return _client + } - val dashboardPlugin: FloconDashboardPlugin - val tablePlugin: FloconTablePlugin - val deeplinksPlugin: FloconDeeplinksPlugin - val analyticsPlugin: FloconAnalyticsPlugin - } + override val isInitialized = MutableStateFlow(false) - var client: Flocon.Client? = null - private set - - fun initialize(context: Context) { + override fun initialize(context: Context) { val app = context.applicationContext val newClient = FloconClientImpl(app) - client = newClient + _client = newClient + isInitialized.value = true scope.launch { start(newClient) } + + super.initialize(context) } private suspend fun start(client: FloconClientImpl) { diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/Protocol.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/Protocol.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/Protocol.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/Protocol.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/client/FloconClientImpl.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/client/FloconClientImpl.kt similarity index 93% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/client/FloconClientImpl.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/client/FloconClientImpl.kt index 378301a9..2dc70250 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/client/FloconClientImpl.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/client/FloconClientImpl.kt @@ -3,10 +3,11 @@ package io.github.openflocon.flocon.client import android.content.Context import android.os.Build import android.provider.Settings -import io.github.openflocon.flocon.Flocon +import io.github.openflocon.flocon.FloconApp import io.github.openflocon.flocon.Protocol import io.github.openflocon.flocon.core.FloconPlugin import io.github.openflocon.flocon.model.FloconMessageFromServer +import io.github.openflocon.flocon.model.floconMessageFromServerFromJson import io.github.openflocon.flocon.model.toFloconMessageToServer import io.github.openflocon.flocon.plugins.SharedPreferences.FloconSharedPreferencesPluginImpl import io.github.openflocon.flocon.plugins.analytics.FloconAnalyticsPluginImpl @@ -14,6 +15,7 @@ import io.github.openflocon.flocon.plugins.dashboard.FloconDashboardPluginImpl import io.github.openflocon.flocon.plugins.database.FloconDatabasePluginImpl import io.github.openflocon.flocon.plugins.deeplinks.FloconDeeplinksPluginImpl import io.github.openflocon.flocon.plugins.files.FloconFilesPluginImpl +import io.github.openflocon.flocon.plugins.network.FloconNetworkPluginImpl import io.github.openflocon.flocon.plugins.tables.FloconTablePluginImpl import io.github.openflocon.flocon.utils.AppUtils import io.github.openflocon.flocon.utils.NetUtils @@ -26,7 +28,7 @@ import kotlinx.coroutines.launch internal class FloconClientImpl( appContext: Context, -) : Flocon.Client { +) : FloconApp.Client { private val FLOCON_PORT = 9023 @@ -47,6 +49,7 @@ internal class FloconClientImpl( override val tablePlugin = FloconTablePluginImpl(sender = this) override val deeplinksPlugin = FloconDeeplinksPluginImpl(sender = this) override val analyticsPlugin = FloconAnalyticsPluginImpl(sender = this) + override val networkPlugin = FloconNetworkPluginImpl(sender = this) private val allPlugins = listOf( databasePlugin, @@ -56,6 +59,7 @@ internal class FloconClientImpl( tablePlugin, deeplinksPlugin, analyticsPlugin, + networkPlugin, ) @Throws(Throwable::class) @@ -79,7 +83,7 @@ internal class FloconClientImpl( private fun onMessageReceived(message: String) { coroutineScope.launch(Dispatchers.IO) { - FloconMessageFromServer.fromJson(message)?.let { messageFromServer -> + floconMessageFromServerFromJson(message)?.let { messageFromServer -> when (messageFromServer.plugin) { Protocol.ToDevice.Database.Plugin -> { databasePlugin.onMessageReceived( diff --git a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt new file mode 100644 index 00000000..8f36f613 --- /dev/null +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/model/FloconMessageFromServer.kt @@ -0,0 +1,21 @@ +package io.github.openflocon.flocon.model + +import io.github.openflocon.flocon.FloconLogger +import org.json.JSONObject + +fun floconMessageFromServerFromJson( + message: String, +): FloconMessageFromServer? { + return try { + val jsonObject = JSONObject(message) + + FloconMessageFromServer( + plugin = jsonObject.getString("plugin"), + method = jsonObject.getString("method"), + body = jsonObject.getString("body"), + ) + } catch (t: Throwable) { + FloconLogger.logError("parsing issue", t) + null + } +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/model/FloconMessageToServer.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/model/FloconMessageToServer.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/model/FloconMessageToServer.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/model/FloconMessageToServer.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt similarity index 72% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt index 0bba84e5..ceff5a90 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/analytics/FloconAnalyticsPlugin.kt @@ -1,26 +1,13 @@ package io.github.openflocon.flocon.plugins.analytics -import io.github.openflocon.flocon.Flocon import io.github.openflocon.flocon.Protocol import io.github.openflocon.flocon.core.FloconMessageSender -import io.github.openflocon.flocon.core.FloconPlugin import io.github.openflocon.flocon.model.FloconMessageFromServer -import io.github.openflocon.flocon.plugins.analytics.builder.AnalyticsBuilder import io.github.openflocon.flocon.plugins.analytics.model.AnalyticsItem +import io.github.openflocon.flocon.plugins.analytics.model.analyticsItemsToJson import org.json.JSONArray import java.util.concurrent.ConcurrentLinkedQueue -fun Flocon.analytics(analyticsName: String): AnalyticsBuilder { - return AnalyticsBuilder( - analyticsTableId = analyticsName, - analyticsPlugin = this.client?.analyticsPlugin, - ) -} - -interface FloconAnalyticsPlugin : FloconPlugin { - fun registerAnalytics(analyticsItems: List) -} - class FloconAnalyticsPluginImpl( private val sender: FloconMessageSender, ) : FloconAnalyticsPlugin { @@ -31,17 +18,17 @@ class FloconAnalyticsPluginImpl( messageFromServer: FloconMessageFromServer, sender: FloconMessageSender, ) { - when(messageFromServer.method) { - Protocol.ToDevice.Analytics.Method.ClearItems-> { + when (messageFromServer.method) { + Protocol.ToDevice.Analytics.Method.ClearItems -> { val items = readIds(messageFromServer.body) - if(items.isNotEmpty()) { + if (items.isNotEmpty()) { clearItems(items.toSet()) } } } } - private fun readIds(body: String) : List { + private fun readIds(body: String): List { return try { val array = JSONArray(body) val items = mutableListOf() @@ -69,7 +56,7 @@ class FloconAnalyticsPluginImpl( sender.send( plugin = Protocol.FromDevice.Analytics.Plugin, method = Protocol.FromDevice.Analytics.Method.AddItems, - body = AnalyticsItem.listToJson(toSend).toString() + body = analyticsItemsToJson(toSend).toString() ) } } diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/TableItem.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/analytics/mapper/AnalyticsItemsMapper.kt similarity index 62% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/TableItem.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/analytics/mapper/AnalyticsItemsMapper.kt index 92a11d74..5b0919e7 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/analytics/model/TableItem.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/analytics/mapper/AnalyticsItemsMapper.kt @@ -3,24 +3,14 @@ package io.github.openflocon.flocon.plugins.analytics.model import org.json.JSONArray import org.json.JSONObject -data class AnalyticsItem( - val id: String, - val analyticsTableId: String, - val eventName: String, - val createdAt: Long, - val properties: List, -) { - companion object { - fun listToJson(items: Collection) : JSONArray { - val array = JSONArray() +fun analyticsItemsToJson(items: Collection) : JSONArray { + val array = JSONArray() - items.forEach { - array.put(it.toJson()) - } - - return array - } + items.forEach { + array.put(it.toJson()) } + + return array } private fun AnalyticsItem.toJson() : JSONObject { diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt similarity index 80% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt index f8b8c849..ce0ea4cd 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/FloconDashboardPlugin.kt @@ -1,12 +1,8 @@ package io.github.openflocon.flocon.plugins.dashboard -import io.github.openflocon.flocon.Flocon import io.github.openflocon.flocon.Protocol import io.github.openflocon.flocon.core.FloconMessageSender -import io.github.openflocon.flocon.core.FloconPlugin import io.github.openflocon.flocon.model.FloconMessageFromServer -import io.github.openflocon.flocon.plugins.dashboard.dsl.DashboardBuilder -import io.github.openflocon.flocon.plugins.dashboard.dsl.dashboardConfig import io.github.openflocon.flocon.plugins.dashboard.mapper.toJson import io.github.openflocon.flocon.plugins.dashboard.model.DashboardCallback import io.github.openflocon.flocon.plugins.dashboard.model.DashboardConfig @@ -14,16 +10,6 @@ import io.github.openflocon.flocon.plugins.dashboard.model.todevice.ToDeviceChec import io.github.openflocon.flocon.plugins.dashboard.model.todevice.ToDeviceSubmittedTextFieldMessage import java.util.concurrent.ConcurrentHashMap - -fun Flocon.dashboard(id: String, block: DashboardBuilder.() -> Unit) { - val dashboardConfig = dashboardConfig(id = id, block) - this.client?.dashboardPlugin?.registerDashboard(dashboardConfig) -} - -interface FloconDashboardPlugin : FloconPlugin { - fun registerDashboard(dashboardConfig: DashboardConfig) -} - class FloconDashboardPluginImpl( private val sender: FloconMessageSender, ) : FloconDashboardPlugin { @@ -41,14 +27,20 @@ class FloconDashboardPluginImpl( callbackMap[id]?.let { it as? DashboardCallback.ButtonCallback }?.action?.invoke() } + Protocol.ToDevice.Dashboard.Method.OnTextFieldSubmitted -> { ToDeviceSubmittedTextFieldMessage.fromJson(messageFromServer.body)?.let { - callbackMap[it.id]?.let { it as? DashboardCallback.TextFieldCallback }?.action?.invoke(it.value) + callbackMap[it.id]?.let { it as? DashboardCallback.TextFieldCallback }?.action?.invoke( + it.value + ) } } + Protocol.ToDevice.Dashboard.Method.OnCheckBoxValueChanged -> { ToDeviceCheckBoxValueChangedMessage.fromJson(messageFromServer.body)?.let { - callbackMap[it.id]?.let { it as? DashboardCallback.CheckBoxCallback }?.action?.invoke(it.value) + callbackMap[it.id]?.let { it as? DashboardCallback.CheckBoxCallback }?.action?.invoke( + it.value + ) } } } diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/mapper/JsonMapper.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/mapper/JsonMapper.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/mapper/JsonMapper.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/mapper/JsonMapper.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/DashboardCallback.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/DashboardCallback.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/DashboardCallback.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/DashboardCallback.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceCheckBoxValueChangedMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceCheckBoxValueChangedMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceCheckBoxValueChangedMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceCheckBoxValueChangedMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceSubmittedTextFieldMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceSubmittedTextFieldMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceSubmittedTextFieldMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/dashboard/model/todevice/ToDeviceSubmittedTextFieldMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt similarity index 99% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt index 5162c5e6..f22e8cb7 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/FloconDatabasePlugin.kt @@ -16,9 +16,6 @@ import io.github.openflocon.flocon.plugins.database.model.todevice.DatabaseQuery import java.io.File import java.util.Locale - -interface FloconDatabasePlugin : FloconPlugin - class FloconDatabasePluginImpl( private val context: Context, ) : FloconDatabasePlugin { diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DatabaseExecuteSqlResponse.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DatabaseExecuteSqlResponse.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DatabaseExecuteSqlResponse.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DatabaseExecuteSqlResponse.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DeviceDataBaseDataModel.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DeviceDataBaseDataModel.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DeviceDataBaseDataModel.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/DeviceDataBaseDataModel.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/QueryResultReceivedDataModel.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/QueryResultReceivedDataModel.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/QueryResultReceivedDataModel.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/fromdevice/QueryResultReceivedDataModel.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/todevice/DatabaseQueryMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/todevice/DatabaseQueryMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/database/model/todevice/DatabaseQueryMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/database/model/todevice/DatabaseQueryMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt similarity index 85% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt index fb3eba74..a205fb8b 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/deeplinks/FloconDeeplinksPlugin.kt @@ -1,23 +1,12 @@ package io.github.openflocon.flocon.plugins.deeplinks -import io.github.openflocon.flocon.Flocon import io.github.openflocon.flocon.Protocol import io.github.openflocon.flocon.core.FloconMessageSender -import io.github.openflocon.flocon.core.FloconPlugin import io.github.openflocon.flocon.model.FloconMessageFromServer import io.github.openflocon.flocon.plugins.deeplinks.model.Deeplink import org.json.JSONArray import org.json.JSONObject - -fun Flocon.deeplinks(deeplinks: List) { - this.client?.deeplinksPlugin?.registerDeeplinks(deeplinks) -} - -interface FloconDeeplinksPlugin : FloconPlugin { - fun registerDeeplinks(deeplinks: List) -} - class FloconDeeplinksPluginImpl( private val sender: FloconMessageSender, ) : FloconDeeplinksPlugin { diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt similarity index 99% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt index 04973be4..77ac9f8c 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/FloconFilesPlugin.kt @@ -13,10 +13,6 @@ import io.github.openflocon.flocon.plugins.files.model.todevice.ToDeviceDeleteFo import io.github.openflocon.flocon.plugins.files.model.todevice.ToDeviceGetFilesMessage import java.io.File - -interface FloconFilesPlugin : FloconPlugin { -} - class FloconFilesPluginImpl( private val context: Context, ) : FloconFilesPlugin { diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FileDataModel.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FileDataModel.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FileDataModel.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FileDataModel.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FilesResultDataModel.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FilesResultDataModel.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FilesResultDataModel.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/fromdevice/FilesResultDataModel.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFileMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFileMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFileMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFileMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFolderContentMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFolderContentMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFolderContentMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceDeleteFolderContentMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceGetFilesMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceGetFilesMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceGetFilesMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/files/model/todevice/ToDeviceGetFilesMessage.kt diff --git a/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt new file mode 100644 index 00000000..1728998b --- /dev/null +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/FloconNetworkPluginImpl.kt @@ -0,0 +1,32 @@ +package io.github.openflocon.flocon.plugins.network + +import io.github.openflocon.flocon.Protocol +import io.github.openflocon.flocon.core.FloconMessageSender +import io.github.openflocon.flocon.model.FloconMessageFromServer +import io.github.openflocon.flocon.plugins.network.model.FloconNetworkRequest +import io.github.openflocon.flocon.plugins.network.model.floconNetworkRequestToJson + +class FloconNetworkPluginImpl( + private var sender: FloconMessageSender, +) : FloconNetworkPlugin { + + override fun log(call: FloconNetworkRequest) { + sender.send( + plugin = Protocol.FromDevice.Network.Plugin, + method = Protocol.FromDevice.Network.Method.LogNetworkCall, + body = floconNetworkRequestToJson(call).toString(), + ) + } + + override fun onMessageReceived( + messageFromServer: FloconMessageFromServer, + sender: FloconMessageSender + ) { + // no op + } + + override fun onConnectedToServer(sender: FloconMessageSender) { + // no op + } + +} \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt similarity index 52% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt index 6c8d1bd9..848a37b9 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/network/model/FloconHttpRequest.kt @@ -2,33 +2,11 @@ package io.github.openflocon.flocon.plugins.network.model import org.json.JSONObject -data class FloconNetworkRequest( - val request: Request, - val response: Response, - val durationMs: Double, - val floconNetworkType: String, -) { - data class Request( - val url: String, - val method: String, - val startTime: Long, - val headers: Map, - val body: String?, - val size: Long?, - ) - data class Response( - val httpCode: Int?, - val grpcStatus: String?, - val contentType: String?, - val body: String?, - val size: Long?, - val headers: Map, - ) - - fun toJson(): JSONObject { - val json = JSONObject() +fun floconNetworkRequestToJson(network: FloconNetworkRequest): JSONObject { + val json = JSONObject() + with(network) { json.put("floconNetworkType", floconNetworkType) json.put("url", request.url) @@ -42,11 +20,11 @@ data class FloconNetworkRequest( response.httpCode?.let { json.put("responseHttpCode", it) } response.grpcStatus?.let { json.put("responseGrpcStatus", it) } - response.contentType?.let { json.put("responseContentType", it) } + response.contentType?.let { json.put("responseContentType", it) } response.body?.let { json.put("responseBody", it) } json.put("responseHeaders", JSONObject(response.headers)) json.put("responseSize", response.size) - - return json } + + return json } \ No newline at end of file diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt similarity index 99% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt index 6a4dd9aa..db1adb08 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/FloconSharedPrefsPlugin.kt @@ -19,9 +19,6 @@ import io.github.openflocon.flocon.plugins.sharedprefs.model.todevice.ToDeviceGe // Got some code from Flipper client // https://github.com/facebook/flipper/blob/main/android/src/main/java/com/facebook/flipper/plugins/sharedpreferences/SharedPreferencesFlipperPlugin.java -interface FloconSharedPreferencesPlugin : FloconPlugin { -} - class FloconSharedPreferencesPluginImpl( private val context: Context, ) : FloconSharedPreferencesPlugin { diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/SharedPreferencesFinder.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/SharedPreferencesFinder.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/SharedPreferencesFinder.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/SharedPreferencesFinder.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/SharedPreferencesDescriptor.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/SharedPreferencesDescriptor.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/SharedPreferencesDescriptor.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/SharedPreferencesDescriptor.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceRowDataModel.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceRowDataModel.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceRowDataModel.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceRowDataModel.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceValueResultDataModel.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceValueResultDataModel.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceValueResultDataModel.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/fromdevice/SharedPreferenceValueResultDataModel.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceEditSharedPreferenceValueMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceEditSharedPreferenceValueMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceEditSharedPreferenceValueMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceEditSharedPreferenceValueMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPreferenceValueMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPreferenceValueMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPreferenceValueMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPreferenceValueMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPrefsMessage.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPrefsMessage.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPrefsMessage.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/sharedprefs/model/todevice/ToDeviceGetSharedPrefsMessage.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt similarity index 73% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt index 2a3fbcb0..d59bd9b8 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/tables/FloconTablesPlugin.kt @@ -1,27 +1,13 @@ package io.github.openflocon.flocon.plugins.tables -import io.github.openflocon.flocon.Flocon import io.github.openflocon.flocon.Protocol import io.github.openflocon.flocon.core.FloconMessageSender -import io.github.openflocon.flocon.core.FloconPlugin import io.github.openflocon.flocon.model.FloconMessageFromServer -import io.github.openflocon.flocon.plugins.tables.builder.TableBuilder import io.github.openflocon.flocon.plugins.tables.model.TableItem +import io.github.openflocon.flocon.plugins.tables.model.tableItemListToJson import org.json.JSONArray import java.util.concurrent.ConcurrentLinkedQueue - -fun Flocon.table(tableName: String): TableBuilder { - return TableBuilder( - tableName = tableName, - tablePlugin = this.client?.tablePlugin, - ) -} - -interface FloconTablePlugin : FloconPlugin { - fun registerTable(tableItem: TableItem) -} - class FloconTablePluginImpl( private val sender: FloconMessageSender, ) : FloconTablePlugin { @@ -32,17 +18,17 @@ class FloconTablePluginImpl( messageFromServer: FloconMessageFromServer, sender: FloconMessageSender, ) { - when(messageFromServer.method) { - Protocol.ToDevice.Table.Method.ClearItems-> { + when (messageFromServer.method) { + Protocol.ToDevice.Table.Method.ClearItems -> { val items = readIds(messageFromServer.body) - if(items.isNotEmpty()) { + if (items.isNotEmpty()) { clearItems(items.toSet()) } } } } - private fun readIds(body: String) : List { + private fun readIds(body: String): List { return try { val array = JSONArray(body) val items = mutableListOf() @@ -70,7 +56,7 @@ class FloconTablePluginImpl( sender.send( plugin = Protocol.FromDevice.Table.Plugin, method = Protocol.FromDevice.Table.Method.AddItems, - body = TableItem.listToJson(tableMessages).toString() + body = tableItemListToJson(tableMessages).toString() ) } } diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt similarity index 57% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt index d55f9363..a069456a 100644 --- a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt +++ b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/plugins/tables/model/TableItem.kt @@ -3,26 +3,17 @@ package io.github.openflocon.flocon.plugins.tables.model import org.json.JSONArray import org.json.JSONObject -data class TableItem( - val id: String, - val name: String, - val createdAt: Long, - val columns: List, -) { - companion object { - fun listToJson(items: Collection) : JSONArray { - val array = JSONArray() +fun tableItemListToJson(items: Collection): JSONArray { + val array = JSONArray() - items.forEach { - array.put(it.toJson()) - } - - return array - } + items.forEach { + array.put(it.toJson()) } + + return array } -private fun TableItem.toJson() : JSONObject { +private fun TableItem.toJson(): JSONObject { val tableItemJson = JSONObject() tableItemJson.put("id", this.id) diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/utils/AppUtils.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/utils/AppUtils.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/utils/AppUtils.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/utils/AppUtils.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/utils/NetUtils.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/utils/NetUtils.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/utils/NetUtils.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/utils/NetUtils.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClient.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClient.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClient.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClient.kt diff --git a/FloconAndroid/core/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt b/FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt similarity index 100% rename from FloconAndroid/core/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt rename to FloconAndroid/flocon/src/main/java/io/github/openflocon/flocon/websocket/FloconWebSocketClientImpl.kt diff --git a/FloconAndroid/core/src/main/res/xml/network_security_config.xml b/FloconAndroid/flocon/src/main/res/xml/network_security_config.xml similarity index 100% rename from FloconAndroid/core/src/main/res/xml/network_security_config.xml rename to FloconAndroid/flocon/src/main/res/xml/network_security_config.xml diff --git a/FloconAndroid/grpc-interceptor/build.gradle.kts b/FloconAndroid/grpc-interceptor/build.gradle.kts index 4c245504..4ae23d01 100644 --- a/FloconAndroid/grpc-interceptor/build.gradle.kts +++ b/FloconAndroid/grpc-interceptor/build.gradle.kts @@ -35,7 +35,7 @@ android { } dependencies { - implementation(project(":core")) + implementation(project(":flocon-base")) implementation(libs.gson) implementation(libs.grpc.android) diff --git a/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcInterceptor.kt b/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcInterceptor.kt index ff3a9d6c..f983bcc8 100644 --- a/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcInterceptor.kt +++ b/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcInterceptor.kt @@ -5,6 +5,7 @@ import com.google.gson.ExclusionStrategy import com.google.gson.FieldAttributes import com.google.gson.Gson import com.google.gson.GsonBuilder +import io.github.openflocon.flocon.FloconApp import io.github.openflocon.flocon.plugins.network.model.FloconNetworkRequest import io.grpc.CallOptions import io.grpc.Channel @@ -48,6 +49,12 @@ class FloconGrpcInterceptor( callOptions: CallOptions, next: Channel, ): ClientCall { + val networkPlugin = FloconApp.instance?.client?.networkPlugin + if(networkPlugin == null) { + // do not intercept if no network plugin, just call + return next.newCall(method, callOptions) + } + val requestId = UUID.randomUUID().toString() return LoggingForwardingClientCall( floconGrpcPlugin = flipperGrpcPlugin, diff --git a/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcPlugin.kt b/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcPlugin.kt index 8c35f636..a5929ef2 100644 --- a/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcPlugin.kt +++ b/FloconAndroid/grpc-interceptor/src/main/java/io/github/openflocon/flocon/grpc/FloconGrpcPlugin.kt @@ -1,13 +1,10 @@ package io.github.openflocon.flocon.grpc -import io.github.openflocon.flocon.Flocon -import io.github.openflocon.flocon.Protocol +import io.github.openflocon.flocon.FloconApp import io.github.openflocon.flocon.plugins.network.model.FloconNetworkRequest import java.util.concurrent.ConcurrentHashMap -internal class FloconGrpcPlugin( - private val floconClient: Flocon.Client? = null, -) { +internal class FloconGrpcPlugin() { private val requests = ConcurrentHashMap() @@ -25,11 +22,9 @@ internal class FloconGrpcPlugin( response = response, floconNetworkType = "grpc", ) - (floconClient ?: Flocon.client)?.send( - plugin = Protocol.FromDevice.Network.Plugin, - method = Protocol.FromDevice.Network.Method.LogNetworkCall, - body = call.toJson().toString(), - ) + + FloconApp.instance?.client?.networkPlugin?.log(call) + requests.remove(callId) } } diff --git a/FloconAndroid/okhttp-interceptor/build.gradle.kts b/FloconAndroid/okhttp-interceptor/build.gradle.kts index da45e2cf..04ba69b2 100644 --- a/FloconAndroid/okhttp-interceptor/build.gradle.kts +++ b/FloconAndroid/okhttp-interceptor/build.gradle.kts @@ -36,7 +36,7 @@ android { dependencies { - implementation(project(":core")) + implementation(project(":flocon-base")) implementation(platform(libs.kotlinx.coroutines.bom)) implementation(libs.jetbrains.kotlinx.coroutines.core) diff --git a/FloconAndroid/okhttp-interceptor/src/main/java/io/github/openflocon/flocon/okhttp/OkHttpInterceptor.kt b/FloconAndroid/okhttp-interceptor/src/main/java/io/github/openflocon/flocon/okhttp/OkHttpInterceptor.kt index f5f5967e..5647a1b0 100644 --- a/FloconAndroid/okhttp-interceptor/src/main/java/io/github/openflocon/flocon/okhttp/OkHttpInterceptor.kt +++ b/FloconAndroid/okhttp-interceptor/src/main/java/io/github/openflocon/flocon/okhttp/OkHttpInterceptor.kt @@ -1,7 +1,6 @@ package io.github.openflocon.flocon.okhttp -import io.github.openflocon.flocon.Flocon -import io.github.openflocon.flocon.Protocol +import io.github.openflocon.flocon.FloconApp import io.github.openflocon.flocon.plugins.network.model.FloconNetworkRequest import okhttp3.Interceptor import okhttp3.MediaType @@ -10,12 +9,16 @@ import okio.Buffer import java.io.IOException import java.nio.charset.StandardCharsets -class FloconOkhttpInterceptor( - private val floconClient: Flocon.Client? = null, -) : Interceptor { +class FloconOkhttpInterceptor() : Interceptor { @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { + val floconNetworkPlugin = FloconApp.instance?.client?.networkPlugin + if (floconNetworkPlugin == null) { + // on no op, do not intercept the call, just execute it + return chain.proceed(chain.request()) + } + val request = chain.request() val requestedAt = System.currentTimeMillis() @@ -59,8 +62,10 @@ class FloconOkhttpInterceptor( if (it != -1L) it else responseBodyString?.toByteArray(StandardCharsets.UTF_8)?.size?.toLong() } } - val requestHeadersMap = request.headers.toMultimap().mapValues { it.value.joinToString(",") } - val responseHeadersMap = response.headers.toMultimap().mapValues { it.value.joinToString(",") } + val requestHeadersMap = + request.headers.toMultimap().mapValues { it.value.joinToString(",") } + val responseHeadersMap = + response.headers.toMultimap().mapValues { it.value.joinToString(",") } val isImage = responseContentType?.toString()?.startsWith("image/") == true @@ -85,12 +90,7 @@ class FloconOkhttpInterceptor( ) ) - val json = floconRequest.toJson() - (floconClient ?: Flocon.client)?.send( // Use Flocon.client directly - plugin = Protocol.FromDevice.Network.Plugin, - method = Protocol.FromDevice.Network.Method.LogNetworkCall, - body = json.toString(), - ) + floconNetworkPlugin.log(floconRequest) // Rebuild the response with a new body so that the chain can continue // The original response body is already consumed by peekBody, so no need to rebuild with it. diff --git a/FloconAndroid/publishLocal.sh b/FloconAndroid/publishLocal.sh index d0075a3a..2324ffd8 100755 --- a/FloconAndroid/publishLocal.sh +++ b/FloconAndroid/publishLocal.sh @@ -1,10 +1,14 @@ ./gradlew \ - :core:assembleRelease \ + :flocon-base:assembleRelease \ + :flocon:assembleRelease \ + :flocon-no-op:assembleRelease \ :grpc-interceptor:assembleRelease \ :okhttp-interceptor:assembleRelease ./gradlew \ - :core:publishToMavenLocal \ + :flocon-base:publishToMavenLocal \ + :flocon:publishToMavenLocal \ + :flocon-no-op:publishToMavenLocal \ :grpc-interceptor:publishToMavenLocal \ :okhttp-interceptor:publishToMavenLocal \ -Psigning.required=false \ No newline at end of file diff --git a/FloconAndroid/settings.gradle.kts b/FloconAndroid/settings.gradle.kts index fc7e5a46..8b50e364 100644 --- a/FloconAndroid/settings.gradle.kts +++ b/FloconAndroid/settings.gradle.kts @@ -10,11 +10,14 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + mavenLocal() } } rootProject.name = "My Application" include(":app") -include(":core") +include(":flocon-base") +include(":flocon") +include(":flocon-no-op") include(":okhttp-interceptor") include(":grpc-interceptor")