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")