Skip to content

Commit 5e52d9f

Browse files
committed
feat(kotlin): expose IdentityCheck preset in Kotlin SDK
1 parent 8536143 commit 5e52d9f

5 files changed

Lines changed: 73 additions & 2 deletions

File tree

kotlin/Examples/IDKitSampleApp/app/src/main/java/com/worldcoin/idkit/sample/MainActivity.kt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.worldcoin.idkit.IDKitRequestConfig
3636
import com.worldcoin.idkit.documentLegacy
3737
import com.worldcoin.idkit.idkitResultToJson
3838
import com.worldcoin.idkit.deviceLegacy
39+
import com.worldcoin.idkit.identityCheck
3940
import com.worldcoin.idkit.orbLegacy
4041
import com.worldcoin.idkit.secureDocumentLegacy
4142
import com.worldcoin.idkit.selfieCheckLegacy
@@ -53,7 +54,9 @@ import okhttp3.Request
5354
import okhttp3.RequestBody.Companion.toRequestBody
5455
import org.json.JSONArray
5556
import org.json.JSONObject
57+
import uniffi.idkit_core.DocumentType
5658
import uniffi.idkit_core.Environment
59+
import uniffi.idkit_core.IdentityAttribute
5760
import uniffi.idkit_core.RpContext
5861

5962
class MainActivity : ComponentActivity() {
@@ -239,7 +242,7 @@ private fun LegacyPresetSelector(
239242
onSelect: (SampleLegacyPreset) -> Unit,
240243
) {
241244
Column(verticalArrangement = Arrangement.spacedBy(6.dp)) {
242-
Text("Legacy preset", style = MaterialTheme.typography.labelLarge)
245+
Text("Preset", style = MaterialTheme.typography.labelLarge)
243246

244247
SampleLegacyPreset.entries
245248
.chunked(2)
@@ -281,6 +284,7 @@ private enum class SampleLegacyPreset(val label: String) {
281284
DOCUMENT("document"),
282285
DEVICE("device"),
283286
SELFIE_CHECK("selfie check"),
287+
IDENTITY_CHECK("identity check"),
284288
;
285289

286290
fun toPreset(signal: String) = when (this) {
@@ -289,6 +293,14 @@ private enum class SampleLegacyPreset(val label: String) {
289293
DOCUMENT -> documentLegacy(signal = signal)
290294
DEVICE -> deviceLegacy(signal = signal)
291295
SELFIE_CHECK -> selfieCheckLegacy(signal = signal)
296+
IDENTITY_CHECK -> identityCheck(
297+
attributes = listOf(
298+
IdentityAttribute.MinimumAge(21u),
299+
IdentityAttribute.Nationality("JPN"),
300+
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
301+
),
302+
requireProofOfHumanity = true,
303+
)
292304
}
293305
}
294306

@@ -366,7 +378,7 @@ private class SampleModel {
366378
deepLinkReceivedForPendingRequest = false
367379

368380
android.util.Log.i("IDKitSample", "IDKit connector URL: ${request.connectorURI}")
369-
log("Using legacy preset: ${legacyPreset.label}")
381+
log("Using preset: ${legacyPreset.label}")
370382
log("Generated request ID: ${request.requestId}")
371383
log("Configured return_to callback: $returnToURL")
372384
startPollingForRequest(

kotlin/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,12 @@ import com.worldcoin.idkit.IDKit
6363
import com.worldcoin.idkit.IDKitPollOptions
6464
import com.worldcoin.idkit.IDKitRequestConfig
6565
import com.worldcoin.idkit.IDKitCompletionResult
66+
import com.worldcoin.idkit.IdentityAttribute
6667
import com.worldcoin.idkit.selfieCheckLegacy
68+
import com.worldcoin.idkit.identityCheck
6769
import com.worldcoin.idkit.orbLegacy
6870
import com.worldcoin.idkit.deviceLegacy
71+
import uniffi.idkit_core.DocumentType
6972
import uniffi.idkit_core.Environment
7073
import uniffi.idkit_core.RpContext
7174

@@ -117,6 +120,23 @@ val request = IDKit
117120
.preset(selfieCheckLegacy(signal = "user-123"))
118121
```
119122

123+
For document-based identity attestation, use:
124+
125+
```kotlin
126+
val request = IDKit
127+
.request(config)
128+
.preset(
129+
identityCheck(
130+
attributes = listOf(
131+
IdentityAttribute.MinimumAge(21u),
132+
IdentityAttribute.Nationality("JPN"),
133+
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
134+
),
135+
requireProofOfHumanity = true,
136+
),
137+
)
138+
```
139+
120140
## Credential request options parity
121141

122142
```kotlin

kotlin/bindings/src/main/kotlin/com/worldcoin/idkit/IdKit.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ typealias IDKitRequestConfig = IdKitRequestConfig
3737
typealias IDKitResult = IdKitResult
3838
typealias RpContext = uniffi.idkit_core.RpContext
3939
typealias Environment = uniffi.idkit_core.Environment
40+
typealias DocumentType = uniffi.idkit_core.DocumentType
41+
typealias IdentityAttribute = uniffi.idkit_core.IdentityAttribute
4042

4143
class IDKitClientError(message: String) : IllegalArgumentException(message)
4244

@@ -332,6 +334,19 @@ fun deviceLegacy(signal: String? = null): Preset = Preset.DeviceLegacy(signal =
332334
*/
333335
fun selfieCheckLegacy(signal: String? = null): Preset = Preset.SelfieCheckLegacy(signal = signal)
334336

337+
/**
338+
* Returns the identity check preset.
339+
*
340+
* This preset requires World ID 4.0-compatible clients.
341+
*/
342+
fun identityCheck(
343+
attributes: List<IdentityAttribute>,
344+
requireProofOfHumanity: Boolean = false,
345+
): Preset = Preset.IdentityCheck(
346+
attributes = attributes,
347+
requireProofOfHumanity = requireProofOfHumanity,
348+
)
349+
335350
fun idkitResultToJson(result: IDKitResult): String = nativeIdkitResultToJson(result)
336351

337352
fun idkitResultFromJson(json: String): IDKitResult = nativeIdkitResultFromJson(json)

kotlin/bindings/src/test/kotlin/com/worldcoin/idkit/IDKitTests.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ import kotlin.test.assertTrue
99
import uniffi.idkit_core.AppError
1010
// TODO: Re-enable when World ID 4.0 is live
1111
// import uniffi.idkit_core.CredentialType
12+
import uniffi.idkit_core.DocumentType
1213
import uniffi.idkit_core.Environment
14+
import uniffi.idkit_core.IdentityAttribute
1315
import uniffi.idkit_core.Preset
1416
import uniffi.idkit_core.ResponseItem
1517
import uniffi.idkit_core.RpContext
@@ -298,6 +300,25 @@ class IDKitTests {
298300
assertEquals("f", (face as Preset.SelfieCheckLegacy).signal)
299301
}
300302

303+
@Test
304+
fun `identityCheck helper exposes canonical preset`() {
305+
val attributes = listOf(
306+
IdentityAttribute.MinimumAge(21u),
307+
IdentityAttribute.Nationality("JPN"),
308+
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
309+
)
310+
311+
val preset = identityCheck(
312+
attributes = attributes,
313+
requireProofOfHumanity = true,
314+
)
315+
316+
assertTrue(preset is Preset.IdentityCheck)
317+
preset as Preset.IdentityCheck
318+
assertEquals(attributes, preset.attributes)
319+
assertTrue(preset.requireProofOfHumanity)
320+
}
321+
301322
@Test
302323
fun `idkit result json helpers roundtrip`() {
303324
val input = sampleResult()

scripts/build-kotlin.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ esac
2020

2121
HOST_LIB="$PROJECT_ROOT/target/release/libidkit.$LIB_EXT"
2222

23+
echo "🎯 Installing Android Rust targets"
24+
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android >/dev/null
25+
2326
echo "🔧 Building Rust library (host) for binding generation"
2427
CARGO_PROFILE_RELEASE_STRIP=none cargo build --package idkit-core --release --locked --features uniffi-bindings
2528

0 commit comments

Comments
 (0)