diff --git a/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaCompose.kt b/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaCompose.kt index 8c9238c..553af84 100644 --- a/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaCompose.kt +++ b/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaCompose.kt @@ -1,12 +1,14 @@ package com.hcaptcha.sdk -import android.app.Activity import android.os.Handler import android.os.Looper import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.Dialog @@ -14,61 +16,28 @@ import androidx.compose.ui.window.DialogProperties @Composable public fun HCaptchaCompose(config: HCaptchaConfig, onResult: (HCaptchaResponse) -> Unit) { - val handler = Handler(Looper.getMainLooper()) - var helper: HCaptchaWebViewHelper? = null - val verifier = object : IHCaptchaVerifier { - override fun onLoaded() { - onResult(HCaptchaResponse.Event(HCaptchaEvent.Loaded)) - if (config.hideDialog) { - helper?.let { - it.resetAndExecute() - } ?: run { - HCaptchaLog.w("HCaptchaWebViewHelper wasn't created, report but to developer") - onResult(HCaptchaResponse.Failure(HCaptchaError.INTERNAL_ERROR)) - } - } - } - - override fun onOpen() { - onResult(HCaptchaResponse.Event(HCaptchaEvent.Opened)) - } - - override fun onSuccess(result: String) { - onResult(HCaptchaResponse.Success(result)) - } - - override fun onFailure(exception: HCaptchaException) { - onResult(HCaptchaResponse.Failure(exception.hCaptchaError)) - } + HCaptchaLog.sDiagnosticsLogEnabled = config.diagnosticLog - override fun startVerification(activity: Activity) { - error("startVerification should never be reached") - } + val context = LocalContext.current + val handler = Handler(Looper.getMainLooper()) + val internalConfig = HCaptchaInternalConfig(com.hcaptcha.sdk.HCaptchaHtml()) - override fun reset() { - error("reset should never be reached") + val helper = remember { mutableStateOf(null) } + val verifier = remember { HCaptchaComposeVerifier(config, onResult, helper) } + val preloadedWebView = remember { + HCaptchaWebView(context).apply { + helper.value = HCaptchaWebViewHelper( + handler, context, config, internalConfig, verifier, this + ) } } - val internalConfig = HCaptchaInternalConfig(com.hcaptcha.sdk.HCaptchaHtml()) - HCaptchaLog.sDiagnosticsLogEnabled = config.diagnosticLog HCaptchaLog.d("HCaptchaCompose($config)") if (config.hideDialog) { AndroidView( modifier = Modifier.size(0.dp), - factory = { context -> - HCaptchaWebView(context).apply { - helper = HCaptchaWebViewHelper( - handler, - context, - config, - internalConfig, - verifier, - this - ) - } - } + factory = { preloadedWebView } ) } else { Dialog( @@ -77,18 +46,7 @@ public fun HCaptchaCompose(config: HCaptchaConfig, onResult: (HCaptchaResponse) ) { AndroidView( modifier = Modifier.fillMaxSize(), - factory = { context -> - HCaptchaWebView(context).apply { - helper = HCaptchaWebViewHelper( - handler, - context, - config, - internalConfig, - verifier, - this - ) - } - } + factory = { preloadedWebView } ) } } diff --git a/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaComposeVerifier.kt b/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaComposeVerifier.kt index 45e5f61..df83232 100644 --- a/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaComposeVerifier.kt +++ b/compose-sdk/src/main/java/com/hcaptcha/sdk/HCaptchaComposeVerifier.kt @@ -1,4 +1,41 @@ -package com.hcaptcha.example.compose +package com.hcaptcha.sdk -class HCaptchaComposeVerifier { +import android.app.Activity +import androidx.compose.runtime.State + +internal class HCaptchaComposeVerifier( + private val config: HCaptchaConfig, + private val onResult: (HCaptchaResponse) -> Unit, + private val helperState: State +) : IHCaptchaVerifier { + + override fun onLoaded() { + onResult(HCaptchaResponse.Event(HCaptchaEvent.Loaded)) + if (config.hideDialog) { + helperState.value?.resetAndExecute() ?: run { + HCaptchaLog.w("HCaptchaWebViewHelper wasn't created, report but to developer") + onResult(HCaptchaResponse.Failure(HCaptchaError.INTERNAL_ERROR)) + } + } + } + + override fun onOpen() { + onResult(HCaptchaResponse.Event(HCaptchaEvent.Opened)) + } + + override fun onSuccess(result: String) { + onResult(HCaptchaResponse.Success(result)) + } + + override fun onFailure(exception: HCaptchaException) { + onResult(HCaptchaResponse.Failure(exception.hCaptchaError)) + } + + override fun startVerification(activity: Activity) { + error("startVerification should never be reached") + } + + override fun reset() { + error("reset should never be reached") + } } \ No newline at end of file diff --git a/example-compose-app/build.gradle b/example-compose-app/build.gradle index 9a6b411..a2b8399 100644 --- a/example-compose-app/build.gradle +++ b/example-compose-app/build.gradle @@ -12,7 +12,7 @@ android { namespace 'com.hcaptcha.example.compose' defaultConfig { - minSdkVersion 23 + minSdkVersion 21 targetSdkVersion intProp("exampleTargetSdkVersion", 35) versionCode 1 versionName "0.0.1" diff --git a/example-compose-app/src/main/java/com/hcaptcha/example/compose/ComposeActivity.kt b/example-compose-app/src/main/java/com/hcaptcha/example/compose/ComposeActivity.kt index 9d912dc..de306d4 100644 --- a/example-compose-app/src/main/java/com/hcaptcha/example/compose/ComposeActivity.kt +++ b/example-compose-app/src/main/java/com/hcaptcha/example/compose/ComposeActivity.kt @@ -21,6 +21,7 @@ import com.hcaptcha.sdk.HCaptchaCompose import com.hcaptcha.sdk.HCaptchaConfig import com.hcaptcha.sdk.HCaptchaEvent import com.hcaptcha.sdk.HCaptchaResponse +import com.hcaptcha.sdk.HCaptchaSize class ComposeActivity : ComponentActivity() { @@ -33,7 +34,9 @@ class ComposeActivity : ComponentActivity() { var text by remember { mutableStateOf("") } Column( - modifier = Modifier.fillMaxSize().padding(16.dp), + modifier = Modifier.fillMaxSize() + .padding(WindowInsets.systemBars.asPaddingValues()) + .padding(16.dp), verticalArrangement = Arrangement.Bottom ) { TextField( @@ -91,6 +94,7 @@ class ComposeActivity : ComponentActivity() { HCaptchaCompose(HCaptchaConfig .builder() .siteKey("10000000-ffff-ffff-ffff-000000000001") + .size(if (hideDialog) HCaptchaSize.INVISIBLE else HCaptchaSize.NORMAL) .hideDialog(hideDialog) .diagnosticLog(true) .build()) { result ->