Skip to content

Commit d3e99e7

Browse files
ISSUE-138440: calling webView.evaluateJavascript in AndroidWebViewEngine.kt on main thread using activity lifecycleScope
1 parent bacd2ad commit d3e99e7

File tree

7 files changed

+25
-12
lines changed
  • core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers
  • engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android
  • samples
    • android-cmp-app/src
      • androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test
      • androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp
    • android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp
  • test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test
  • ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers

7 files changed

+25
-12
lines changed

core/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/core/components/containers/ListViewComponent.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) {
3737
var items by mutableStateOf(emptyList<Item>())
3838
private set
3939
private var selectedItemIndexToSubmit: Int? = null
40-
var updateIndex by mutableStateOf(0L)
41-
private set
4240

4341
override fun applyProps(props: JsonObject) {
4442
label = props.getString("label")
@@ -53,7 +51,7 @@ class ListViewComponent(context: ComponentContext) : BaseComponent(context) {
5351
.map {
5452
Item(it.toFoldedItemContent(emptyMap(), ""))
5553
}
56-
++updateIndex
54+
checkAutoSubmit()
5755
}
5856

5957
fun onItemSelected(itemIndex: Int) {

engine-webview/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/engine/webview/android/AndroidWebViewEngine.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ import com.pega.constellation.sdk.kmp.engine.webview.android.internal.SdkWebView
3636
import com.pega.constellation.sdk.kmp.engine.webview.common.EngineConfiguration
3737
import com.pega.constellation.sdk.kmp.engine.webview.common.InternalError
3838
import com.pega.constellation.sdk.kmp.engine.webview.common.JsError
39+
import kotlinx.coroutines.CoroutineScope
40+
import kotlinx.coroutines.launch
3941

4042
import okhttp3.OkHttpClient
4143
import org.json.JSONObject
@@ -44,7 +46,8 @@ import java.util.concurrent.TimeUnit
4446
class AndroidWebViewEngine(
4547
private val context: Context,
4648
private val okHttpClient: OkHttpClient,
47-
private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient()
49+
private val nonDxOkHttpClient: OkHttpClient = defaultHttpClient(),
50+
private val lifecycleScope: CoroutineScope
4851
) : ConstellationSdkEngine {
4952

5053
private lateinit var config: ConstellationSdkConfig
@@ -133,7 +136,9 @@ class AndroidWebViewEngine(
133136
put("eventData", JSONObject(event.eventData))
134137
}
135138
val script = "window.sendEventToComponent('${id.id}', '$eventJson')"
136-
webView.evaluateJavascript(script, null)
139+
this.lifecycleScope.launch {
140+
webView.evaluateJavascript(script, null)
141+
}
137142
}
138143

139144
@SuppressLint("SetJavaScriptEnabled")

samples/android-cmp-app/src/androidInstrumentedTest/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/test/ComposeTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ abstract class ComposeTest(
4242
private val context = instrumentation.targetContext
4343
private val authManager = AuthManager(scope, FakeAuthFlowFactory(), FakeTokenStore(mode.token))
4444
private val httpClient = buildHttpClient(authManager)
45-
private val engine = AndroidWebViewEngine(context, httpClient, httpClient)
45+
private val engine = AndroidWebViewEngine(context, httpClient, httpClient, scope)
4646

4747
@BeforeTest
4848
fun setUp() {

samples/android-cmp-app/src/androidMain/kotlin/com/pega/constellation/sdk/kmp/samples/androidcmpapp/MediaCoActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ class MediaCoActivity : ComponentActivity() {
2828
val authFlowFactory = AndroidCodeAuthFlowFactory().also { it.registerActivity(this) }
2929
val authManager = createAuthManager(authFlowFactory)
3030

31-
val engine = AndroidWebViewEngine(this, buildHttpClient(authManager))
31+
val engine = AndroidWebViewEngine(
32+
context = this,
33+
okHttpClient = buildHttpClient(authManager),
34+
lifecycleScope = this.lifecycleScope
35+
)
3236
Injector.init(authManager, engine)
3337
AppContext.init(this)
3438

samples/android-compose-app/src/main/java/com/pega/constellation/sdk/kmp/samples/androidcomposeapp/AndroidComposeActivity.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.compose.runtime.setValue
1919
import androidx.compose.ui.Alignment
2020
import androidx.compose.ui.Modifier
2121
import androidx.compose.ui.unit.dp
22+
import androidx.lifecycle.lifecycleScope
2223
import com.pega.constellation.sdk.kmp.core.ConstellationSdk
2324
import com.pega.constellation.sdk.kmp.core.ConstellationSdk.State
2425
import com.pega.constellation.sdk.kmp.core.ConstellationSdk.State.Cancelled
@@ -75,7 +76,11 @@ class AndroidComposeActivity : ComponentActivity() {
7576
debuggable = true
7677
)
7778
val caseClassName = AndroidSDKConfig.PEGA_CASE_CLASS_NAME
78-
val engine = AndroidWebViewEngine(this, buildHttpClient())
79+
val engine = AndroidWebViewEngine(
80+
context = this,
81+
okHttpClient = buildHttpClient(),
82+
lifecycleScope = this.lifecycleScope
83+
)
7984
sdk = ConstellationSdk.create(config, engine)
8085
sdk.createCase(caseClassName)
8186
}

test/src/androidDeviceTest/kotlin/com/pega/constellation/sdk/kmp/test/ConstellationSdkTest.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,23 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
55
import com.pega.constellation.sdk.kmp.engine.webview.android.AndroidWebViewEngine
66
import com.pega.constellation.sdk.kmp.test.mock.MockHttpClient
77
import com.pega.constellation.sdk.kmp.test.mock.PegaVersion
8+
import kotlinx.coroutines.CoroutineScope
9+
import kotlinx.coroutines.Dispatchers
810
import org.junit.runner.RunWith
911
import kotlin.test.BeforeTest
1012

1113
@RunWith(AndroidJUnit4::class)
1214
class ConstellationSdkTest : ConstellationSdkBaseTest() {
1315
private val appContext = InstrumentationRegistry.getInstrumentation().targetContext
16+
private val scope = CoroutineScope(Dispatchers.Main)
1417

1518
@BeforeTest
1619
fun setup() {
1720
engine = AndroidWebViewEngine(
1821
context = appContext,
1922
okHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0),
20-
nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0)
23+
nonDxOkHttpClient = MockHttpClient(appContext, PegaVersion.v24_1_0),
24+
lifecycleScope = scope
2125
)
2226
}
2327
}

ui-renderer-cmp/src/commonMain/kotlin/com/pega/constellation/sdk/kmp/ui/renderer/cmp/containers/ListViewRenderer.kt

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ class ListViewRenderer : ComponentRenderer<ListViewComponent> {
2525
onItemSelected(it)
2626
}
2727
)
28-
LaunchedEffect(updateIndex) {
29-
checkAutoSubmit()
30-
}
3128
}
3229

3330
private fun SelectionMode.toTableSelectionMode() = when (this) {

0 commit comments

Comments
 (0)