Skip to content

Commit a173a1a

Browse files
CAMOBAPDSergiu
andauthored
feat: preload webview (#175)
* feat: create WebView before xml inflation * feat: compose-sdk wrap HCaptchaWebView into remember * chore: upgrade com.android.tools.build:gradle:8.7.3 * chore: bump version 4.1.0 * chore: make log statements follow format "identifier: message" Co-authored-by: Sergiu D. <[email protected]> --------- Co-authored-by: Sergiu D. <[email protected]>
1 parent c83aad6 commit a173a1a

File tree

22 files changed

+223
-130
lines changed

22 files changed

+223
-130
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
- name: 'HTML ES5 test'
3636
run: |
3737
npm install -g jshint
38-
java -cp sdk/build/intermediates/javac/release/classes com.hcaptcha.sdk.HCaptchaHtml > sdk/build/hcaptcha-form.html
38+
java -cp sdk/build/intermediates/javac/release/compileReleaseJavaWithJavac/classes com.hcaptcha.sdk.HCaptchaHtml > sdk/build/hcaptcha-form.html
3939
jshint --extract=always sdk/build/hcaptcha-form.html
4040
- name: 'JitPack Test'
4141
run: ./gradlew publishReleasePublicationToMavenLocal

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
# 4.1.0
4+
5+
- Feat: preload WebView on `setup` call
6+
37
# 4.0.5
48

59
- compose-sdk: set minSdk to 21

benchmark/src/androidTest/java/com/hcaptcha/sdk/TestHCaptchaHtml.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import androidx.annotation.NonNull;
44

5-
import com.hcaptcha.sdk.IHCaptchaHtmlProvider;
6-
75
class TestHCaptchaHtml implements IHCaptchaHtmlProvider {
86

97
@Override

benchmark/src/androidTest/java/com/hcaptcha/sdk/TestHCaptchaVerifier.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import android.app.Activity;
44

5+
import androidx.annotation.NonNull;
6+
57
public class TestHCaptchaVerifier implements IHCaptchaVerifier {
68

79
@Override
8-
public void startVerification(Activity activity) {
10+
public void startVerification(@NonNull Activity activity) {
911
// no implementation need for performance measurement
1012
}
1113

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ buildscript {
55
mavenCentral()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:8.1.4'
9-
classpath 'androidx.benchmark:benchmark-gradle-plugin:1.2.4'
8+
classpath 'com.android.tools.build:gradle:8.7.3'
9+
classpath 'androidx.benchmark:benchmark-gradle-plugin:1.3.3'
1010
classpath 'com.slack.keeper:keeper:0.16.0'
1111
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1212
}

compose-sdk/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ android {
2020
// See https://developer.android.com/studio/publish/versioning
2121
// versionCode must be integer and be incremented by one for every new update
2222
// android system uses this to prevent downgrades
23-
versionCode 44
23+
versionCode 45
2424

2525
// version number visible to the user
2626
// should follow semantic versioning (See https://semver.org)
27-
versionName "4.0.5"
27+
versionName "4.1.0"
2828

2929
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
3030
consumerProguardFiles "consumer-rules.pro"

compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaCompose.kt

Lines changed: 16 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,43 @@
11
package com.hcaptcha.sdk
22

3-
import android.app.Activity
43
import android.os.Handler
54
import android.os.Looper
65
import androidx.compose.foundation.layout.fillMaxSize
76
import androidx.compose.foundation.layout.size
87
import androidx.compose.runtime.Composable
8+
import androidx.compose.runtime.mutableStateOf
9+
import androidx.compose.runtime.remember
910
import androidx.compose.ui.Modifier
11+
import androidx.compose.ui.platform.LocalContext
1012
import androidx.compose.ui.unit.dp
1113
import androidx.compose.ui.viewinterop.AndroidView
1214
import androidx.compose.ui.window.Dialog
1315
import androidx.compose.ui.window.DialogProperties
1416

1517
@Composable
1618
public fun HCaptchaCompose(config: HCaptchaConfig, onResult: (HCaptchaResponse) -> Unit) {
17-
val handler = Handler(Looper.getMainLooper())
18-
var helper: HCaptchaWebViewHelper? = null
19-
val verifier = object : IHCaptchaVerifier {
20-
override fun onLoaded() {
21-
onResult(HCaptchaResponse.Event(HCaptchaEvent.Loaded))
22-
if (config.hideDialog) {
23-
helper?.let {
24-
it.resetAndExecute()
25-
} ?: run {
26-
HCaptchaLog.w("HCaptchaWebViewHelper wasn't created, report but to developer")
27-
onResult(HCaptchaResponse.Failure(HCaptchaError.INTERNAL_ERROR))
28-
}
29-
}
30-
}
31-
32-
override fun onOpen() {
33-
onResult(HCaptchaResponse.Event(HCaptchaEvent.Opened))
34-
}
35-
36-
override fun onSuccess(result: String) {
37-
onResult(HCaptchaResponse.Success(result))
38-
}
39-
40-
override fun onFailure(exception: HCaptchaException) {
41-
onResult(HCaptchaResponse.Failure(exception.hCaptchaError))
42-
}
19+
HCaptchaLog.sDiagnosticsLogEnabled = config.diagnosticLog
4320

44-
override fun startVerification(activity: Activity) {
45-
error("startVerification should never be reached")
46-
}
21+
val context = LocalContext.current
22+
val handler = Handler(Looper.getMainLooper())
23+
val internalConfig = HCaptchaInternalConfig(com.hcaptcha.sdk.HCaptchaHtml())
4724

48-
override fun reset() {
49-
error("reset should never be reached")
25+
val helper = remember { mutableStateOf<HCaptchaWebViewHelper?>(null) }
26+
val verifier = remember { HCaptchaComposeVerifier(config, onResult, helper) }
27+
val preloadedWebView = remember {
28+
HCaptchaWebView(context).apply {
29+
helper.value = HCaptchaWebViewHelper(
30+
handler, context, config, internalConfig, verifier, this
31+
)
5032
}
5133
}
52-
val internalConfig = HCaptchaInternalConfig(com.hcaptcha.sdk.HCaptchaHtml())
53-
HCaptchaLog.sDiagnosticsLogEnabled = config.diagnosticLog
5434

5535
HCaptchaLog.d("HCaptchaCompose($config)")
5636

5737
if (config.hideDialog) {
5838
AndroidView(
5939
modifier = Modifier.size(0.dp),
60-
factory = { context ->
61-
HCaptchaWebView(context).apply {
62-
helper = HCaptchaWebViewHelper(
63-
handler,
64-
context,
65-
config,
66-
internalConfig,
67-
verifier,
68-
this
69-
)
70-
}
71-
}
40+
factory = { preloadedWebView }
7241
)
7342
} else {
7443
Dialog(
@@ -77,18 +46,7 @@ public fun HCaptchaCompose(config: HCaptchaConfig, onResult: (HCaptchaResponse)
7746
) {
7847
AndroidView(
7948
modifier = Modifier.fillMaxSize(),
80-
factory = { context ->
81-
HCaptchaWebView(context).apply {
82-
helper = HCaptchaWebViewHelper(
83-
handler,
84-
context,
85-
config,
86-
internalConfig,
87-
verifier,
88-
this
89-
)
90-
}
91-
}
49+
factory = { preloadedWebView }
9250
)
9351
}
9452
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.hcaptcha.sdk
2+
3+
import android.app.Activity
4+
import androidx.compose.runtime.State
5+
6+
internal class HCaptchaComposeVerifier(
7+
private val config: HCaptchaConfig,
8+
private val onResult: (HCaptchaResponse) -> Unit,
9+
private val helperState: State<HCaptchaWebViewHelper?>
10+
) : IHCaptchaVerifier {
11+
12+
override fun onLoaded() {
13+
onResult(HCaptchaResponse.Event(HCaptchaEvent.Loaded))
14+
if (config.hideDialog) {
15+
helperState.value?.resetAndExecute() ?: run {
16+
HCaptchaLog.w("HCaptchaWebViewHelper wasn't created, report but to developer")
17+
onResult(HCaptchaResponse.Failure(HCaptchaError.INTERNAL_ERROR))
18+
}
19+
}
20+
}
21+
22+
override fun onOpen() {
23+
onResult(HCaptchaResponse.Event(HCaptchaEvent.Opened))
24+
}
25+
26+
override fun onSuccess(result: String) {
27+
onResult(HCaptchaResponse.Success(result))
28+
}
29+
30+
override fun onFailure(exception: HCaptchaException) {
31+
onResult(HCaptchaResponse.Failure(exception.hCaptchaError))
32+
}
33+
34+
override fun startVerification(activity: Activity) {
35+
error("startVerification should never be reached")
36+
}
37+
38+
override fun reset() {
39+
error("reset should never be reached")
40+
}
41+
}

example-compose-app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ android {
1212
namespace 'com.hcaptcha.example.compose'
1313

1414
defaultConfig {
15-
minSdkVersion 23
15+
minSdkVersion 21
1616
targetSdkVersion intProp("exampleTargetSdkVersion", 35)
1717
versionCode 1
1818
versionName "0.0.1"

example-compose-app/src/main/java/com/hcaptcha/example/compose/ComposeActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.hcaptcha.sdk.HCaptchaCompose
2121
import com.hcaptcha.sdk.HCaptchaConfig
2222
import com.hcaptcha.sdk.HCaptchaEvent
2323
import com.hcaptcha.sdk.HCaptchaResponse
24+
import com.hcaptcha.sdk.HCaptchaSize
2425

2526
class ComposeActivity : ComponentActivity() {
2627

@@ -33,7 +34,9 @@ class ComposeActivity : ComponentActivity() {
3334
var text by remember { mutableStateOf("") }
3435

3536
Column(
36-
modifier = Modifier.fillMaxSize().padding(16.dp),
37+
modifier = Modifier.fillMaxSize()
38+
.padding(WindowInsets.systemBars.asPaddingValues())
39+
.padding(16.dp),
3740
verticalArrangement = Arrangement.Bottom
3841
) {
3942
TextField(
@@ -91,6 +94,7 @@ class ComposeActivity : ComponentActivity() {
9194
HCaptchaCompose(HCaptchaConfig
9295
.builder()
9396
.siteKey("10000000-ffff-ffff-ffff-000000000001")
97+
.size(if (hideDialog) HCaptchaSize.INVISIBLE else HCaptchaSize.NORMAL)
9498
.hideDialog(hideDialog)
9599
.diagnosticLog(true)
96100
.build()) { result ->

0 commit comments

Comments
 (0)