Skip to content

Commit cfa8aa4

Browse files
authored
Merge pull request #13 from OpacityLabs/nero/ENG-101-dynamic-params-textbox
add dynamic params textbox
2 parents c8fa824 + 0a55013 commit cfa8aa4

File tree

4 files changed

+52
-6
lines changed

4 files changed

+52
-6
lines changed

OpacityCore/src/main/kotlin/com/opacitylabs/opacitycore/JsonToAnyConverter.kt renamed to OpacityCore/src/main/kotlin/com/opacitylabs/opacitycore/JsonConverter.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,26 @@ import kotlinx.serialization.json.doubleOrNull
1212
import kotlinx.serialization.json.int
1313
import kotlinx.serialization.json.intOrNull
1414

15-
class JsonToAnyConverter {
16-
15+
class JsonConverter {
1716
companion object {
17+
fun mapToJsonElement(map: Map<String, Any?>): JsonElement {
18+
fun toJsonElement(value: Any?): JsonElement = when (value) {
19+
null -> JsonNull
20+
is Boolean -> JsonPrimitive(value)
21+
is Number -> JsonPrimitive(value)
22+
is String -> JsonPrimitive(value)
23+
is Map<*, *> -> {
24+
@Suppress("UNCHECKED_CAST")
25+
JsonObject((value as Map<String, Any?>).mapValues { toJsonElement(it.value) })
26+
}
27+
28+
is List<*> -> JsonArray(value.map { toJsonElement(it) })
29+
else -> throw IllegalArgumentException("Unsupported type: ${value::class}")
30+
}
31+
32+
return JsonObject(map.mapValues { toJsonElement(it.value) })
33+
}
34+
1835
fun parseJsonElementToAny(jsonElement: JsonElement): Any? {
1936
return when (jsonElement) {
2037
is JsonObject -> {

OpacityCore/src/main/kotlin/com/opacitylabs/opacitycore/OpacityCore.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import android.content.Context
44
import android.content.Intent
55
import android.os.Bundle
66
import androidx.localbroadcastmanager.content.LocalBroadcastManager
7-
import com.opacitylabs.opacitycore.JsonToAnyConverter.Companion.parseJsonElementToAny
7+
import com.opacitylabs.opacitycore.JsonConverter.Companion.mapToJsonElement
8+
import com.opacitylabs.opacitycore.JsonConverter.Companion.parseJsonElementToAny
89
import kotlinx.coroutines.Dispatchers
910
import kotlinx.coroutines.withContext
1011
import kotlinx.serialization.encodeToString
@@ -134,7 +135,11 @@ object OpacityCore {
134135
@JvmStatic
135136
suspend fun get(name: String, params: Map<String, Any?>?): Result<Map<String, Any?>> {
136137
return withContext(Dispatchers.IO) {
137-
val paramsString = params?.let { Json.encodeToString(it) }
138+
val paramsString = params?.let {
139+
val jsonElement = mapToJsonElement(it)
140+
Json.encodeToString(jsonElement)
141+
}
142+
138143
val res = getNative(name, paramsString)
139144
if (res.status != 0) {
140145
return@withContext Result.failure(parseOpacityError(res.err))

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ android {
5858
}
5959

6060
dependencies {
61+
implementation(libs.androidx.appcompat)
6162
implementation(libs.androidx.core.ktx)
6263
implementation(libs.androidx.lifecycle.runtime.ktx)
6364
implementation(libs.androidx.activity.compose)
@@ -68,6 +69,7 @@ dependencies {
6869
implementation(libs.androidx.material3)
6970
implementation(project(":OpacityCore"))
7071
implementation(libs.androidx.espresso.intents)
72+
implementation(libs.kotlinx.serialization.json)
7173
testImplementation(libs.junit)
7274
androidTestImplementation(libs.androidx.junit)
7375
androidTestImplementation(libs.androidx.espresso.core)

app/src/main/java/com/opacitylabs/opacitycoreexample/MainActivity.kt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ import androidx.compose.runtime.mutableStateOf
1717
import androidx.compose.runtime.remember
1818
import androidx.compose.ui.Modifier
1919
import androidx.lifecycle.lifecycleScope
20+
import com.opacitylabs.opacitycore.JsonConverter
2021
import com.opacitylabs.opacitycore.OpacityCore
2122
import com.opacitylabs.opacitycore.OpacityError
2223
import com.opacitylabs.opacitycoreexample.ui.theme.OpacityCoreExampleTheme
2324
import kotlinx.coroutines.launch
25+
import kotlinx.serialization.json.Json
2426
import java.io.BufferedReader
2527
import java.io.InputStreamReader
2628

@@ -51,18 +53,37 @@ class MainActivity : ComponentActivity() {
5153
containerColor = androidx.compose.ui.graphics.Color.Black
5254
) { innerPadding ->
5355
Column(modifier = Modifier.padding(innerPadding)) {
54-
val flowInput = remember { mutableStateOf("github:profile") }
56+
val flowInput = remember { mutableStateOf("instagram:comments") }
57+
val paramsInput =
58+
remember { mutableStateOf("{\"previous_response\":\"\"}") }
5559

5660
TextField(
5761
value = flowInput.value,
5862
onValueChange = { flowInput.value = it },
5963
label = { Text("Enter flow") }
6064
)
6165

66+
TextField(
67+
value = paramsInput.value,
68+
onValueChange = { paramsInput.value = it },
69+
label = { Text("Enter JSON parameters (optional)") }
70+
)
71+
6272
Button(
6373
onClick = {
6474
lifecycleScope.launch {
65-
val res = OpacityCore.get(flowInput.value, null)
75+
var params: Map<String, Any>? = null
76+
77+
if (!paramsInput.value.isBlank()) {
78+
params =
79+
JsonConverter.parseJsonElementToAny(
80+
Json.parseToJsonElement(
81+
paramsInput.value
82+
)
83+
) as Map<String, Any>?
84+
}
85+
86+
val res = OpacityCore.get(flowInput.value, params)
6687
res.fold(
6788
onSuccess = { value ->
6889
Log.e(
@@ -80,6 +101,7 @@ class MainActivity : ComponentActivity() {
80101
else -> Log.e("MainActivity", it.toString())
81102
}
82103
})
104+
83105
}
84106
},
85107
) { Text(text = "Run Flow") }

0 commit comments

Comments
 (0)