From bacd2adf928c42b979767e029ac4d843c24d5579 Mon Sep 17 00:00:00 2001 From: pelcm Date: Wed, 10 Dec 2025 13:13:11 +0100 Subject: [PATCH 1/5] ISSUE-138440: WIP autosubmit form when option selected on ListView --- .../sdk/kmp/core/api/ComponentManager.kt | 7 +++++++ .../containers/ListViewComponent.kt | 21 +++++++++++++++++++ .../kmp/core/internal/ComponentManagerImpl.kt | 2 ++ .../cmp/containers/ListViewRenderer.kt | 9 +++++++- 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/api/ComponentManager.kt b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/api/ComponentManager.kt index 8f13f1c5..14819e97 100644 --- a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/api/ComponentManager.kt +++ b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/api/ComponentManager.kt @@ -29,6 +29,13 @@ interface ComponentManager { */ fun getComponent(id: ComponentId): Component? + /** + * Retrieves all components. + * + * @return A list of all components. + */ + fun getComponents(): List + /** * Retrieves multiple components by their unique identifiers. * diff --git a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt index 6f74fa89..a6d7f663 100644 --- a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt +++ b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt @@ -7,10 +7,12 @@ import com.pega.constellation.sdk.kmp.core.Log import com.pega.constellation.sdk.kmp.core.api.BaseComponent import com.pega.constellation.sdk.kmp.core.api.ComponentContext import com.pega.constellation.sdk.kmp.core.api.ComponentEvent +import com.pega.constellation.sdk.kmp.core.components.ComponentTypes.ActionButtons import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent.SelectionMode.MULTI import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent.SelectionMode.SINGLE import com.pega.constellation.sdk.kmp.core.components.getJSONArray import com.pega.constellation.sdk.kmp.core.components.getString +import com.pega.constellation.sdk.kmp.core.components.widgets.ActionButtonsComponent import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject @@ -34,6 +36,9 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { private set var items by mutableStateOf(emptyList()) private set + private var selectedItemIndexToSubmit: Int? = null + var updateIndex by mutableStateOf(0L) + private set override fun applyProps(props: JsonObject) { label = props.getString("label") @@ -48,6 +53,7 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { .map { Item(it.toFoldedItemContent(emptyMap(), "")) } + ++updateIndex } fun onItemSelected(itemIndex: Int) { @@ -55,6 +61,21 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { context.sendComponentEvent(itemSelectedEvent(itemIndex)) } + fun setValueToAutoSubmit(selectedItemIndex: Int) { + selectedItemIndexToSubmit = selectedItemIndex + } + + fun checkAutoSubmit() { + if (selectedItemIndexToSubmit != null && selectedItemIndex == selectedItemIndexToSubmit) { + selectedItemIndexToSubmit = null + val actionButtons = context.componentManager.getComponents() + .first { it.context.type == ActionButtons } as? ActionButtonsComponent + actionButtons?.primaryButtons?.firstOrNull()?.let { + actionButtons.onClick(it) + } + } + } + private fun itemSelectedEvent(itemIndex: Int) = ComponentEvent( type = SELECT_SINGLE_ITEM_EVENT, diff --git a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/internal/ComponentManagerImpl.kt b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/internal/ComponentManagerImpl.kt index d3d4d7c8..696f5cf6 100644 --- a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/internal/ComponentManagerImpl.kt +++ b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/internal/ComponentManagerImpl.kt @@ -25,6 +25,8 @@ internal class ComponentManagerImpl( override fun getComponent(id: ComponentId) = components[id] ?: Log.w(TAG, "Cannot find component $id").let { null } + override fun getComponents(): List = components.map { it.value } + override fun getComponents(ids: List) = ids.mapNotNull { getComponent(it) } diff --git a/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt b/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt index e4f852cd..706afb91 100644 --- a/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt +++ b/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt @@ -1,6 +1,7 @@ package com.pega.constellation.sdk.kmp.ui.renderer.cmp.containers import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent.SelectionMode import com.pega.constellation.sdk.kmp.ui.components.cmp.controls.form.Table @@ -19,8 +20,14 @@ class ListViewRenderer : ComponentRenderer { columnsLabels = columnLabels, items = items.map { TableItem(it.data) }, selectedItem = selectedItem?.let { TableItem(it.data) }, - onItemClick = ::onItemSelected + onItemClick = { + setValueToAutoSubmit(it) + onItemSelected(it) + } ) + LaunchedEffect(updateIndex) { + checkAutoSubmit() + } } private fun SelectionMode.toTableSelectionMode() = when (this) { From d3e99e7395a00e4dae8a1b581cfa96133196aaec Mon Sep 17 00:00:00 2001 From: pelcm Date: Thu, 11 Dec 2025 11:32:02 +0100 Subject: [PATCH 2/5] ISSUE-138440: calling webView.evaluateJavascript in AndroidWebViewEngine.kt on main thread using activity lifecycleScope --- .../kmp/core/components/containers/ListViewComponent.kt | 4 +--- .../kmp/engine/webview/android/AndroidWebViewEngine.kt | 9 +++++++-- .../sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt | 2 +- .../sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt | 6 +++++- .../samples/androidcomposeapp/AndroidComposeActivity.kt | 7 ++++++- .../constellation/sdk/kmp/test/ConstellationSdkTest.kt | 6 +++++- .../kmp/ui/renderer/cmp/containers/ListViewRenderer.kt | 3 --- 7 files changed, 25 insertions(+), 12 deletions(-) diff --git a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt index a6d7f663..6e4cad05 100644 --- a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt +++ b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt @@ -37,8 +37,6 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { var items by mutableStateOf(emptyList()) private set private var selectedItemIndexToSubmit: Int? = null - var updateIndex by mutableStateOf(0L) - private set override fun applyProps(props: JsonObject) { label = props.getString("label") @@ -53,7 +51,7 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { .map { Item(it.toFoldedItemContent(emptyMap(), "")) } - ++updateIndex + checkAutoSubmit() } fun onItemSelected(itemIndex: Int) { diff --git a/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt b/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt index 7b857822..77e44d11 100644 --- a/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt +++ b/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt @@ -36,6 +36,8 @@ import com.pega.constellation.sdk.kmp.engine.webview.android.internal.SdkWebView import com.pega.constellation.sdk.kmp.engine.webview.common.EngineConfiguration import com.pega.constellation.sdk.kmp.engine.webview.common.InternalError import com.pega.constellation.sdk.kmp.engine.webview.common.JsError +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch import okhttp3.OkHttpClient import org.json.JSONObject @@ -44,7 +46,8 @@ import java.util.concurrent.TimeUnit class AndroidWebViewEngine( private val context: Context, private val okHttpClient: OkHttpClient, - private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient() + private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient(), + private val lifecycleScope: CoroutineScope ) : ConstellationSdkEngine { private lateinit var config: ConstellationSdkConfig @@ -133,7 +136,9 @@ class AndroidWebViewEngine( put("eventData", JSONObject(event.eventData)) } val script = "window.sendEventToComponent('${id.id}', '$eventJson')" - webView.evaluateJavascript(script, null) + this.lifecycleScope.launch { + webView.evaluateJavascript(script, null) + } } @SuppressLint("SetJavaScriptEnabled") diff --git a/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt b/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt index e0c20f69..9d00082a 100644 --- a/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt +++ b/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt @@ -42,7 +42,7 @@ abstract class ComposeTest( private val context = instrumentation.targetContext private val authManager = AuthManager(scope, FakeAuthFlowFactory(), FakeTokenStore(mode.token)) private val httpClient = buildHttpClient(authManager) - private val engine = AndroidWebViewEngine(context, httpClient, httpClient) + private val engine = AndroidWebViewEngine(context, httpClient, httpClient, scope) @BeforeTest fun setUp() { diff --git a/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt b/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt index 367e453f..92022e0c 100644 --- a/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt +++ b/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt @@ -28,7 +28,11 @@ class MediaCoActivity : ComponentActivity() { val authFlowFactory = AndroidCodeAuthFlowFactory().also { it.registerActivity(this) } val authManager = createAuthManager(authFlowFactory) - val engine = AndroidWebViewEngine(this, buildHttpClient(authManager)) + val engine = AndroidWebViewEngine( + context = this, + okHttpClient = buildHttpClient(authManager), + lifecycleScope = this.lifecycleScope + ) Injector.init(authManager, engine) AppContext.init(this) diff --git a/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt b/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt index 623c96b8..0dfcb365 100644 --- a/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt +++ b/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt @@ -19,6 +19,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import androidx.lifecycle.lifecycleScope import com.pega.constellation.sdk.kmp.core.ConstellationSdk import com.pega.constellation.sdk.kmp.core.ConstellationSdk.State import com.pega.constellation.sdk.kmp.core.ConstellationSdk.State.Cancelled @@ -75,7 +76,11 @@ class AndroidComposeActivity : ComponentActivity() { debuggable = true ) val caseClassName = AndroidSDKConfig.PEGA_CASE_CLASS_NAME - val engine = AndroidWebViewEngine(this, buildHttpClient()) + val engine = AndroidWebViewEngine( + context = this, + okHttpClient = buildHttpClient(), + lifecycleScope = this.lifecycleScope + ) sdk = ConstellationSdk.create(config, engine) sdk.createCase(caseClassName) } diff --git a/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt b/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt index d357a3aa..6df30b0f 100644 --- a/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt +++ b/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt @@ -5,19 +5,23 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.pega.constellation.sdk.kmp.engine.webview.android.AndroidWebViewEngine import com.pega.constellation.sdk.kmp.test.mock.MockHttpClient import com.pega.constellation.sdk.kmp.test.mock.PegaVersion +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import org.junit.runner.RunWith import kotlin.test.BeforeTest @RunWith(AndroidJUnit4::class) class ConstellationSdkTest : ConstellationSdkBaseTest() { private val appContext = InstrumentationRegistry.getInstrumentation().targetContext + private val scope = CoroutineScope(Dispatchers.Main) @BeforeTest fun setup() { engine = AndroidWebViewEngine( context = appContext, okHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0), - nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0) + nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0), + lifecycleScope = scope ) } } \ No newline at end of file diff --git a/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt b/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt index 706afb91..f1e15f31 100644 --- a/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt +++ b/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt @@ -25,9 +25,6 @@ class ListViewRenderer : ComponentRenderer { onItemSelected(it) } ) - LaunchedEffect(updateIndex) { - checkAutoSubmit() - } } private fun SelectionMode.toTableSelectionMode() = when (this) { From 3a56aa370f79370523e1b2e47ea855169d723700 Mon Sep 17 00:00:00 2001 From: pelcm Date: Thu, 11 Dec 2025 13:11:00 +0100 Subject: [PATCH 3/5] ISSUE-138440: revert changes in ListViewComponent.kt and ListViewRenderer.kt --- .../containers/ListViewComponent.kt | 19 ------------------- .../cmp/containers/ListViewRenderer.kt | 6 +----- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt index 6e4cad05..6f74fa89 100644 --- a/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt +++ b/core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt @@ -7,12 +7,10 @@ import com.pega.constellation.sdk.kmp.core.Log import com.pega.constellation.sdk.kmp.core.api.BaseComponent import com.pega.constellation.sdk.kmp.core.api.ComponentContext import com.pega.constellation.sdk.kmp.core.api.ComponentEvent -import com.pega.constellation.sdk.kmp.core.components.ComponentTypes.ActionButtons import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent.SelectionMode.MULTI import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent.SelectionMode.SINGLE import com.pega.constellation.sdk.kmp.core.components.getJSONArray import com.pega.constellation.sdk.kmp.core.components.getString -import com.pega.constellation.sdk.kmp.core.components.widgets.ActionButtonsComponent import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject @@ -36,7 +34,6 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { private set var items by mutableStateOf(emptyList()) private set - private var selectedItemIndexToSubmit: Int? = null override fun applyProps(props: JsonObject) { label = props.getString("label") @@ -51,7 +48,6 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { .map { Item(it.toFoldedItemContent(emptyMap(), "")) } - checkAutoSubmit() } fun onItemSelected(itemIndex: Int) { @@ -59,21 +55,6 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) { context.sendComponentEvent(itemSelectedEvent(itemIndex)) } - fun setValueToAutoSubmit(selectedItemIndex: Int) { - selectedItemIndexToSubmit = selectedItemIndex - } - - fun checkAutoSubmit() { - if (selectedItemIndexToSubmit != null && selectedItemIndex == selectedItemIndexToSubmit) { - selectedItemIndexToSubmit = null - val actionButtons = context.componentManager.getComponents() - .first { it.context.type == ActionButtons } as? ActionButtonsComponent - actionButtons?.primaryButtons?.firstOrNull()?.let { - actionButtons.onClick(it) - } - } - } - private fun itemSelectedEvent(itemIndex: Int) = ComponentEvent( type = SELECT_SINGLE_ITEM_EVENT, diff --git a/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt b/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt index f1e15f31..e4f852cd 100644 --- a/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt +++ b/ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt @@ -1,7 +1,6 @@ package com.pega.constellation.sdk.kmp.ui.renderer.cmp.containers import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent import com.pega.constellation.sdk.kmp.core.components.containers.ListViewComponent.SelectionMode import com.pega.constellation.sdk.kmp.ui.components.cmp.controls.form.Table @@ -20,10 +19,7 @@ class ListViewRenderer : ComponentRenderer { columnsLabels = columnLabels, items = items.map { TableItem(it.data) }, selectedItem = selectedItem?.let { TableItem(it.data) }, - onItemClick = { - setValueToAutoSubmit(it) - onItemSelected(it) - } + onItemClick = ::onItemSelected ) } From 3b1940aea7679f7029bfd99f98ddbef20266842a Mon Sep 17 00:00:00 2001 From: pelcm Date: Thu, 11 Dec 2025 13:14:18 +0100 Subject: [PATCH 4/5] ISSUE-138440: minor changes in AndroidWebViewEngine.kt --- .../sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt | 4 ++-- .../sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt | 3 ++- .../sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt | 4 ++-- .../kmp/samples/androidcomposeapp/AndroidComposeActivity.kt | 4 ++-- .../pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt | 4 ++-- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt b/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt index 77e44d11..1898a9b2 100644 --- a/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt +++ b/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt @@ -45,9 +45,9 @@ import java.util.concurrent.TimeUnit class AndroidWebViewEngine( private val context: Context, + private val lifecycleScope: CoroutineScope, private val okHttpClient: OkHttpClient, - private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient(), - private val lifecycleScope: CoroutineScope + private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient() ) : ConstellationSdkEngine { private lateinit var config: ConstellationSdkConfig diff --git a/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt b/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt index 9d00082a..127ab282 100644 --- a/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt +++ b/samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt @@ -38,11 +38,12 @@ abstract class ComposeTest( val mode: ComposeTestMode = MockServer, ) { private val scope = CoroutineScope(Dispatchers.Default) + private val webViewScope = CoroutineScope(Dispatchers.Main) private val instrumentation = InstrumentationRegistry.getInstrumentation() private val context = instrumentation.targetContext private val authManager = AuthManager(scope, FakeAuthFlowFactory(), FakeTokenStore(mode.token)) private val httpClient = buildHttpClient(authManager) - private val engine = AndroidWebViewEngine(context, httpClient, httpClient, scope) + private val engine = AndroidWebViewEngine(context, webViewScope, httpClient, httpClient) @BeforeTest fun setUp() { diff --git a/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt b/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt index 92022e0c..a067fd06 100644 --- a/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt +++ b/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt @@ -30,8 +30,8 @@ class MediaCoActivity : ComponentActivity() { val engine = AndroidWebViewEngine( context = this, - okHttpClient = buildHttpClient(authManager), - lifecycleScope = this.lifecycleScope + lifecycleScope = this.lifecycleScope, + okHttpClient = buildHttpClient(authManager) ) Injector.init(authManager, engine) AppContext.init(this) diff --git a/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt b/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt index 0dfcb365..cf1e43c0 100644 --- a/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt +++ b/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt @@ -78,8 +78,8 @@ class AndroidComposeActivity : ComponentActivity() { val caseClassName = AndroidSDKConfig.PEGA_CASE_CLASS_NAME val engine = AndroidWebViewEngine( context = this, - okHttpClient = buildHttpClient(), - lifecycleScope = this.lifecycleScope + lifecycleScope = this.lifecycleScope, + okHttpClient = buildHttpClient() ) sdk = ConstellationSdk.create(config, engine) sdk.createCase(caseClassName) diff --git a/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt b/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt index 6df30b0f..98de05ad 100644 --- a/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt +++ b/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt @@ -19,9 +19,9 @@ class ConstellationSdkTest : ConstellationSdkBaseTest() { fun setup() { engine = AndroidWebViewEngine( context = appContext, + lifecycleScope = scope, okHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0), - nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0), - lifecycleScope = scope + nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0) ) } } \ No newline at end of file From 0034d6ba59bca57144fc73ab546d20709db0f388 Mon Sep 17 00:00:00 2001 From: pelcm Date: Thu, 11 Dec 2025 14:23:17 +0100 Subject: [PATCH 5/5] ISSUE-138440: rename lifecyclescope to scopr in AndroidWebViewEngine constructor launch evaluateJavascript with Dispatchers.Main.immediate --- .../sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt | 5 +++-- .../sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt | 2 +- .../kmp/samples/androidcomposeapp/AndroidComposeActivity.kt | 2 +- .../pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt b/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt index 1898a9b2..e28376bb 100644 --- a/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt +++ b/engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt @@ -37,6 +37,7 @@ import com.pega.constellation.sdk.kmp.engine.webview.common.EngineConfiguration import com.pega.constellation.sdk.kmp.engine.webview.common.InternalError import com.pega.constellation.sdk.kmp.engine.webview.common.JsError import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import okhttp3.OkHttpClient @@ -45,7 +46,7 @@ import java.util.concurrent.TimeUnit class AndroidWebViewEngine( private val context: Context, - private val lifecycleScope: CoroutineScope, + private val scope: CoroutineScope, private val okHttpClient: OkHttpClient, private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient() ) : ConstellationSdkEngine { @@ -136,7 +137,7 @@ class AndroidWebViewEngine( put("eventData", JSONObject(event.eventData)) } val script = "window.sendEventToComponent('${id.id}', '$eventJson')" - this.lifecycleScope.launch { + this.scope.launch(Dispatchers.Main.immediate) { webView.evaluateJavascript(script, null) } } diff --git a/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt b/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt index a067fd06..13ef0bd0 100644 --- a/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt +++ b/samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt @@ -30,7 +30,7 @@ class MediaCoActivity : ComponentActivity() { val engine = AndroidWebViewEngine( context = this, - lifecycleScope = this.lifecycleScope, + scope = this.lifecycleScope, okHttpClient = buildHttpClient(authManager) ) Injector.init(authManager, engine) diff --git a/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt b/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt index cf1e43c0..a8ddd9d2 100644 --- a/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt +++ b/samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt @@ -78,7 +78,7 @@ class AndroidComposeActivity : ComponentActivity() { val caseClassName = AndroidSDKConfig.PEGA_CASE_CLASS_NAME val engine = AndroidWebViewEngine( context = this, - lifecycleScope = this.lifecycleScope, + scope = this.lifecycleScope, okHttpClient = buildHttpClient() ) sdk = ConstellationSdk.create(config, engine) diff --git a/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt b/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt index 98de05ad..8447277e 100644 --- a/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt +++ b/test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt @@ -19,7 +19,7 @@ class ConstellationSdkTest : ConstellationSdkBaseTest() { fun setup() { engine = AndroidWebViewEngine( context = appContext, - lifecycleScope = scope, + scope = scope, okHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0), nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0) )