Skip to content

Commit 40a2bc8

Browse files
committed
feat(kotlin): expose IdentityCheck preset in Kotlin SDK
1 parent 26ea946 commit 40a2bc8

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

@@ -310,6 +312,19 @@ fun deviceLegacy(signal: String? = null): Preset = Preset.DeviceLegacy(signal =
310312
*/
311313
fun selfieCheckLegacy(signal: String? = null): Preset = Preset.SelfieCheckLegacy(signal = signal)
312314

315+
/**
316+
* Returns the identity check preset.
317+
*
318+
* This preset requires World ID 4.0-compatible clients.
319+
*/
320+
fun identityCheck(
321+
attributes: List<IdentityAttribute>,
322+
requireProofOfHumanity: Boolean = false,
323+
): Preset = Preset.IdentityCheck(
324+
attributes = attributes,
325+
requireProofOfHumanity = requireProofOfHumanity,
326+
)
327+
313328
fun idkitResultToJson(result: IDKitResult): String = nativeIdkitResultToJson(result)
314329

315330
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
@@ -262,6 +264,25 @@ class IDKitTests {
262264
assertEquals("f", (face as Preset.SelfieCheckLegacy).signal)
263265
}
264266

267+
@Test
268+
fun `identityCheck helper exposes canonical preset`() {
269+
val attributes = listOf(
270+
IdentityAttribute.MinimumAge(21u),
271+
IdentityAttribute.Nationality("JPN"),
272+
IdentityAttribute.DocumentType(DocumentType.PASSPORT),
273+
)
274+
275+
val preset = identityCheck(
276+
attributes = attributes,
277+
requireProofOfHumanity = true,
278+
)
279+
280+
assertTrue(preset is Preset.IdentityCheck)
281+
preset as Preset.IdentityCheck
282+
assertEquals(attributes, preset.attributes)
283+
assertTrue(preset.requireProofOfHumanity)
284+
}
285+
265286
@Test
266287
fun `idkit result json helpers roundtrip`() {
267288
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)