@tokamakdev/plugin-local-authentication 0.1.0-beta.107 → 0.1.0-beta.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,8 +8,12 @@ Add it to your project's dependencies:
8
8
  npm install @tokamakdev/plugin-local-authentication
9
9
  ```
10
10
 
11
+ Pages import the generated `/client` SDK. In `src/tokamak.ts`, import the
12
+ package root and call its factory with the handler's `ctx`. The main worker
13
+ uses its generated `env.TOKAMAK_LOCAL_AUTHENTICATION` service binding when present.
14
+
11
15
  ```ts
12
- import { localAuthentication } from "@tokamakdev/plugin-local-authentication";
16
+ import localAuthentication from "@tokamakdev/plugin-local-authentication/client";
13
17
 
14
18
  // "available" | "notEnrolled" | "unavailable"
15
19
  const status = await localAuthentication.status("biometricsOrPasscode");
@@ -35,6 +39,14 @@ where the system cannot show its prompt.
35
39
  any data. To bind a stored value to authentication, use
36
40
  `@tokamakdev/plugin-secure-storage`.
37
41
 
42
+ ## Platform bindings
43
+
44
+ `@tokamakdev/plugin-local-authentication/apple` is the Local Authentication
45
+ framework, and `@tokamakdev/plugin-local-authentication/android` is
46
+ `android.hardware.biometrics` with the `Context`, `CancellationSignal` and
47
+ `Executor` types it uses, for Worker code that needs what this API does not
48
+ offer.
49
+
38
50
  ## Platforms
39
51
 
40
52
  - **iOS and macOS:** LocalAuthentication. On macOS, `biometricsOrPasscode`
@@ -0,0 +1,271 @@
1
+ // Generated by `tok bindings` from the Android 35 SDK: android.hardware.biometrics, android.content.Context, android.os.CancellationSignal, java.util.concurrent.Executor. Do not edit.
2
+ @file:Suppress("DEPRECATION", "OVERRIDE_DEPRECATION", "UNCHECKED_CAST")
3
+ @file:SuppressLint("MissingPermission")
4
+
5
+ package com.tokamak.bindings.local_authentication
6
+
7
+ import android.annotation.SuppressLint
8
+ import android.os.Build
9
+ import com.tokamak.runtime.TokamakBinding
10
+ import com.tokamak.runtime.TokamakHost
11
+ import com.tokamak.runtime.TokamakPlugin
12
+ import com.tokamak.runtime.TokamakPluginBytesReply
13
+ import com.tokamak.runtime.TokamakPluginError
14
+
15
+ class Bindings(private val host: TokamakHost) : TokamakPlugin {
16
+ override val id = "local-authentication/android"
17
+
18
+ override fun callBytes(method: String, payload: ByteArray, reply: TokamakPluginBytesReply): (() -> Unit)? {
19
+ val b = TokamakBinding(payload, host.resources, reply)
20
+ return when (method.substringBefore('#')) {
21
+ "BiometricManager" -> callBiometricManager(method, b)
22
+ "BiometricManager.Strings" -> callBiometricManager_Strings(method, b)
23
+ "BiometricPrompt" -> callBiometricPrompt(method, b)
24
+ "BiometricPrompt.AuthenticationCallback" -> callBiometricPrompt_AuthenticationCallback(method, b)
25
+ "BiometricPrompt.AuthenticationResult" -> callBiometricPrompt_AuthenticationResult(method, b)
26
+ "BiometricPrompt.Builder" -> callBiometricPrompt_Builder(method, b)
27
+ "BiometricPrompt.CryptoObject" -> callBiometricPrompt_CryptoObject(method, b)
28
+ "PromptContentItemBulletedText" -> callPromptContentItemBulletedText(method, b)
29
+ "PromptContentItemPlainText" -> callPromptContentItemPlainText(method, b)
30
+ "PromptContentViewWithMoreOptionsButton" -> callPromptContentViewWithMoreOptionsButton(method, b)
31
+ "PromptContentViewWithMoreOptionsButton.Builder" -> callPromptContentViewWithMoreOptionsButton_Builder(method, b)
32
+ "PromptVerticalListContentView" -> callPromptVerticalListContentView(method, b)
33
+ "PromptVerticalListContentView.Builder" -> callPromptVerticalListContentView_Builder(method, b)
34
+ "Context" -> callContext(method, b)
35
+ "Context.BindServiceFlags" -> callContext_BindServiceFlags(method, b)
36
+ "CancellationSignal" -> callCancellationSignal(method, b)
37
+ "CancellationSignal.OnCancelListener" -> callCancellationSignal_OnCancelListener(method, b)
38
+ else -> b.unsupported(method)
39
+ }
40
+ }
41
+
42
+ override fun subscribeBytes(method: String, payload: ByteArray, reply: TokamakPluginBytesReply): () -> Unit {
43
+ val b = TokamakBinding(payload, host.resources, reply)
44
+ return when (method) {
45
+ "BiometricPrompt.AuthenticationCallback" -> {
46
+ if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable
47
+ b.implement { BiometricPrompt_AuthenticationCallbackImplementation(it) }
48
+ }
49
+ "CancellationSignal.OnCancelListener" -> {
50
+ if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable
51
+ b.implement { CancellationSignal_OnCancelListenerImplementation(it) }
52
+ }
53
+ else -> throw TokamakPluginError.notSupported("$method is not supported")
54
+ }
55
+ }
56
+
57
+ private fun callBiometricManager(method: String, b: TokamakBinding): (() -> Unit)? =
58
+ when (method) {
59
+ "BiometricManager#canAuthenticate()I" -> b.run { if (Build.VERSION.SDK_INT < 29) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager::class.java).canAuthenticate()) }
60
+ "BiometricManager#canAuthenticate(I)I" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager::class.java).canAuthenticate(b.int(b[0]))) }
61
+ "BiometricManager#getStrings(I)Landroid/hardware/biometrics/BiometricManager\$Strings;" -> b.run { if (Build.VERSION.SDK_INT < 31) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager::class.java).getStrings(b.int(b[0]))) }
62
+ "BiometricManager#getLastAuthenticationTime(I)J" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager::class.java).getLastAuthenticationTime(b.int(b[0]))) }
63
+ else -> b.unsupported(method)
64
+ }
65
+
66
+ private fun callBiometricManager_Strings(method: String, b: TokamakBinding): (() -> Unit)? =
67
+ when (method) {
68
+ "BiometricManager.Strings#getButtonLabel()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 31) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager.Strings::class.java).getButtonLabel()) }
69
+ "BiometricManager.Strings#getPromptMessage()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 31) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager.Strings::class.java).getPromptMessage()) }
70
+ "BiometricManager.Strings#getSettingName()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 31) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricManager.Strings::class.java).getSettingName()) }
71
+ else -> b.unsupported(method)
72
+ }
73
+
74
+ private fun callBiometricPrompt(method: String, b: TokamakBinding): (() -> Unit)? =
75
+ when (method) {
76
+ "BiometricPrompt#authenticate(Landroid/hardware/biometrics/BiometricPrompt\$CryptoObject;Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/hardware/biometrics/BiometricPrompt\$AuthenticationCallback;)V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.target(android.hardware.biometrics.BiometricPrompt::class.java).authenticate(b.obj(b[0], android.hardware.biometrics.BiometricPrompt.CryptoObject::class.java), b.obj(b[1], android.os.CancellationSignal::class.java), b.obj(b[2], java.util.concurrent.Executor::class.java), b.obj(b[3], android.hardware.biometrics.BiometricPrompt.AuthenticationCallback::class.java)); null }
77
+ "BiometricPrompt#authenticate(Landroid/os/CancellationSignal;Ljava/util/concurrent/Executor;Landroid/hardware/biometrics/BiometricPrompt\$AuthenticationCallback;)V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.target(android.hardware.biometrics.BiometricPrompt::class.java).authenticate(b.obj(b[0], android.os.CancellationSignal::class.java), b.obj(b[1], java.util.concurrent.Executor::class.java), b.obj(b[2], android.hardware.biometrics.BiometricPrompt.AuthenticationCallback::class.java)); null }
78
+ "BiometricPrompt#getTitle()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getTitle()) }
79
+ "BiometricPrompt#getSubtitle()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getSubtitle()) }
80
+ "BiometricPrompt#getDescription()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getDescription()) }
81
+ "BiometricPrompt#getNegativeButtonText()Ljava/lang/CharSequence;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getNegativeButtonText()) }
82
+ "BiometricPrompt#isConfirmationRequired()Z" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).isConfirmationRequired()) }
83
+ "BiometricPrompt#getAllowedAuthenticators()I" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getAllowedAuthenticators()) }
84
+ "BiometricPrompt#getLogoRes()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getLogoRes()) }
85
+ "BiometricPrompt#getLogoDescription()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getLogoDescription()) }
86
+ "BiometricPrompt#getContentView()Landroid/hardware/biometrics/PromptContentView;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt::class.java).getContentView()) }
87
+ else -> b.unsupported(method)
88
+ }
89
+
90
+ private fun callBiometricPrompt_AuthenticationCallback(method: String, b: TokamakBinding): (() -> Unit)? =
91
+ when (method) {
92
+ "BiometricPrompt.AuthenticationCallback#onAuthenticationError(ILjava/lang/CharSequence;)V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.target(android.hardware.biometrics.BiometricPrompt.AuthenticationCallback::class.java).onAuthenticationError(b.int(b[0]), b.optional(b[1]) { x1 -> b.string(x1) }); null }
93
+ "BiometricPrompt.AuthenticationCallback#onAuthenticationHelp(ILjava/lang/CharSequence;)V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.target(android.hardware.biometrics.BiometricPrompt.AuthenticationCallback::class.java).onAuthenticationHelp(b.int(b[0]), b.optional(b[1]) { x1 -> b.string(x1) }); null }
94
+ "BiometricPrompt.AuthenticationCallback#onAuthenticationSucceeded(Landroid/hardware/biometrics/BiometricPrompt\$AuthenticationResult;)V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.target(android.hardware.biometrics.BiometricPrompt.AuthenticationCallback::class.java).onAuthenticationSucceeded(b.optional(b[0]) { x1 -> b.obj(x1, android.hardware.biometrics.BiometricPrompt.AuthenticationResult::class.java) }); null }
95
+ "BiometricPrompt.AuthenticationCallback#onAuthenticationFailed()V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.target(android.hardware.biometrics.BiometricPrompt.AuthenticationCallback::class.java).onAuthenticationFailed(); null }
96
+ else -> b.unsupported(method)
97
+ }
98
+
99
+ private fun callBiometricPrompt_AuthenticationResult(method: String, b: TokamakBinding): (() -> Unit)? =
100
+ when (method) {
101
+ "BiometricPrompt.AuthenticationResult#getCryptoObject()Landroid/hardware/biometrics/BiometricPrompt\$CryptoObject;" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.AuthenticationResult::class.java).getCryptoObject()) }
102
+ "BiometricPrompt.AuthenticationResult#getAuthenticationType()I" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.AuthenticationResult::class.java).getAuthenticationType()) }
103
+ else -> b.unsupported(method)
104
+ }
105
+
106
+ private fun callBiometricPrompt_Builder(method: String, b: TokamakBinding): (() -> Unit)? =
107
+ when (method) {
108
+ "BiometricPrompt.Builder#<init>(Landroid/content/Context;)V" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.BiometricPrompt.Builder(b.optional(b[0]) { x1 -> b.obj(x1, android.content.Context::class.java) })) }
109
+ "BiometricPrompt.Builder#setTitle(Ljava/lang/CharSequence;)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setTitle(b.string(b[0]))) }
110
+ "BiometricPrompt.Builder#setSubtitle(Ljava/lang/CharSequence;)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setSubtitle(b.string(b[0]))) }
111
+ "BiometricPrompt.Builder#setDescription(Ljava/lang/CharSequence;)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setDescription(b.string(b[0]))) }
112
+ "BiometricPrompt.Builder#build()Landroid/hardware/biometrics/BiometricPrompt;" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).build()) }
113
+ "BiometricPrompt.Builder#setConfirmationRequired(Z)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 29) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setConfirmationRequired(b.boolean(b[0]))) }
114
+ "BiometricPrompt.Builder#setDeviceCredentialAllowed(Z)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 29) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setDeviceCredentialAllowed(b.boolean(b[0]))) }
115
+ "BiometricPrompt.Builder#setAllowedAuthenticators(I)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setAllowedAuthenticators(b.int(b[0]))) }
116
+ "BiometricPrompt.Builder#setLogoRes(I)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setLogoRes(b.int(b[0]))) }
117
+ "BiometricPrompt.Builder#setLogoDescription(Ljava/lang/String;)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setLogoDescription(b.string(b[0]))) }
118
+ "BiometricPrompt.Builder#setContentView(Landroid/hardware/biometrics/PromptContentView;)Landroid/hardware/biometrics/BiometricPrompt\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.Builder::class.java).setContentView(b.obj(b[0], android.hardware.biometrics.PromptContentView::class.java))) }
119
+ else -> b.unsupported(method)
120
+ }
121
+
122
+ private fun callBiometricPrompt_CryptoObject(method: String, b: TokamakBinding): (() -> Unit)? =
123
+ when (method) {
124
+ "BiometricPrompt.CryptoObject#<init>(J)V" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.BiometricPrompt.CryptoObject(b.long(b[0]))) }
125
+ "BiometricPrompt.CryptoObject#getOperationHandle()J" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.BiometricPrompt.CryptoObject::class.java).getOperationHandle()) }
126
+ else -> b.unsupported(method)
127
+ }
128
+
129
+ private fun callPromptContentItemBulletedText(method: String, b: TokamakBinding): (() -> Unit)? =
130
+ when (method) {
131
+ "PromptContentItemBulletedText#<init>(Ljava/lang/String;)V" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.PromptContentItemBulletedText(b.string(b[0]))) }
132
+ "PromptContentItemBulletedText#describeContents()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptContentItemBulletedText::class.java).describeContents()) }
133
+ else -> b.unsupported(method)
134
+ }
135
+
136
+ private fun callPromptContentItemPlainText(method: String, b: TokamakBinding): (() -> Unit)? =
137
+ when (method) {
138
+ "PromptContentItemPlainText#<init>(Ljava/lang/String;)V" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.PromptContentItemPlainText(b.string(b[0]))) }
139
+ "PromptContentItemPlainText#describeContents()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptContentItemPlainText::class.java).describeContents()) }
140
+ else -> b.unsupported(method)
141
+ }
142
+
143
+ private fun callPromptContentViewWithMoreOptionsButton(method: String, b: TokamakBinding): (() -> Unit)? =
144
+ when (method) {
145
+ "PromptContentViewWithMoreOptionsButton#getDescription()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptContentViewWithMoreOptionsButton::class.java).getDescription()) }
146
+ "PromptContentViewWithMoreOptionsButton#describeContents()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptContentViewWithMoreOptionsButton::class.java).describeContents()) }
147
+ else -> b.unsupported(method)
148
+ }
149
+
150
+ private fun callPromptContentViewWithMoreOptionsButton_Builder(method: String, b: TokamakBinding): (() -> Unit)? =
151
+ when (method) {
152
+ "PromptContentViewWithMoreOptionsButton.Builder#<init>()V" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.PromptContentViewWithMoreOptionsButton.Builder()) }
153
+ "PromptContentViewWithMoreOptionsButton.Builder#setDescription(Ljava/lang/String;)Landroid/hardware/biometrics/PromptContentViewWithMoreOptionsButton\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptContentViewWithMoreOptionsButton.Builder::class.java).setDescription(b.string(b[0]))) }
154
+ "PromptContentViewWithMoreOptionsButton.Builder#build()Landroid/hardware/biometrics/PromptContentViewWithMoreOptionsButton;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptContentViewWithMoreOptionsButton.Builder::class.java).build()) }
155
+ else -> b.unsupported(method)
156
+ }
157
+
158
+ private fun callPromptVerticalListContentView(method: String, b: TokamakBinding): (() -> Unit)? =
159
+ when (method) {
160
+ "PromptVerticalListContentView#getMaxItemCount()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.PromptVerticalListContentView.getMaxItemCount()) }
161
+ "PromptVerticalListContentView#getMaxEachItemCharacterNumber()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.PromptVerticalListContentView.getMaxEachItemCharacterNumber()) }
162
+ "PromptVerticalListContentView#getDescription()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView::class.java).getDescription()) }
163
+ "PromptVerticalListContentView#getListItems()Ljava/util/List;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView::class.java).getListItems()) }
164
+ "PromptVerticalListContentView#describeContents()I" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView::class.java).describeContents()) }
165
+ else -> b.unsupported(method)
166
+ }
167
+
168
+ private fun callPromptVerticalListContentView_Builder(method: String, b: TokamakBinding): (() -> Unit)? =
169
+ when (method) {
170
+ "PromptVerticalListContentView.Builder#<init>()V" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(android.hardware.biometrics.PromptVerticalListContentView.Builder()) }
171
+ "PromptVerticalListContentView.Builder#setDescription(Ljava/lang/String;)Landroid/hardware/biometrics/PromptVerticalListContentView\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView.Builder::class.java).setDescription(b.string(b[0]))) }
172
+ "PromptVerticalListContentView.Builder#addListItem(Landroid/hardware/biometrics/PromptContentItem;)Landroid/hardware/biometrics/PromptVerticalListContentView\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView.Builder::class.java).addListItem(b.obj(b[0], android.hardware.biometrics.PromptContentItem::class.java))) }
173
+ "PromptVerticalListContentView.Builder#addListItem(Landroid/hardware/biometrics/PromptContentItem;I)Landroid/hardware/biometrics/PromptVerticalListContentView\$Builder;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView.Builder::class.java).addListItem(b.obj(b[0], android.hardware.biometrics.PromptContentItem::class.java), b.int(b[1]))) }
174
+ "PromptVerticalListContentView.Builder#build()Landroid/hardware/biometrics/PromptVerticalListContentView;" -> b.run { if (Build.VERSION.SDK_INT < 35) throw TokamakBinding.unavailable; b.encode(b.target(android.hardware.biometrics.PromptVerticalListContentView.Builder::class.java).build()) }
175
+ else -> b.unsupported(method)
176
+ }
177
+
178
+ private fun callContext(method: String, b: TokamakBinding): (() -> Unit)? =
179
+ when (method) {
180
+ "Context#getApplicationContext()Landroid/content/Context;" -> b.run { b.encode(b.target(android.content.Context::class.java).getApplicationContext()) }
181
+ "Context#getText(I)Ljava/lang/CharSequence;" -> b.run { b.encode(b.target(android.content.Context::class.java).getText(b.int(b[0]))) }
182
+ "Context#getString(I)Ljava/lang/String;" -> b.run { b.encode(b.target(android.content.Context::class.java).getString(b.int(b[0]))) }
183
+ "Context#getString(I[Ljava/lang/Object;)Ljava/lang/String;" -> b.run { b.encode(b.target(android.content.Context::class.java).getString(b.int(b[0]), *b.list(b[1]) { x1 -> b.optional(x1) { x2 -> b.any(x2) } }.toTypedArray())) }
184
+ "Context#setTheme(I)V" -> b.run { b.target(android.content.Context::class.java).setTheme(b.int(b[0])); null }
185
+ "Context#getPackageName()Ljava/lang/String;" -> b.run { b.encode(b.target(android.content.Context::class.java).getPackageName()) }
186
+ "Context#deleteFile(Ljava/lang/String;)Z" -> b.run { b.encode(b.target(android.content.Context::class.java).deleteFile(b.optional(b[0]) { x1 -> b.string(x1) })) }
187
+ "Context#fileList()[Ljava/lang/String;" -> b.run { b.encode(b.target(android.content.Context::class.java).fileList()) }
188
+ "Context#deleteDatabase(Ljava/lang/String;)Z" -> b.run { b.encode(b.target(android.content.Context::class.java).deleteDatabase(b.optional(b[0]) { x1 -> b.string(x1) })) }
189
+ "Context#databaseList()[Ljava/lang/String;" -> b.run { b.encode(b.target(android.content.Context::class.java).databaseList()) }
190
+ "Context#getWallpaperDesiredMinimumWidth()I" -> b.run { b.encode(b.target(android.content.Context::class.java).getWallpaperDesiredMinimumWidth()) }
191
+ "Context#getWallpaperDesiredMinimumHeight()I" -> b.run { b.encode(b.target(android.content.Context::class.java).getWallpaperDesiredMinimumHeight()) }
192
+ "Context#clearWallpaper()V" -> b.run { b.target(android.content.Context::class.java).clearWallpaper(); null }
193
+ "Context#getSystemService(Ljava/lang/String;)Ljava/lang/Object;" -> b.run { b.encode(b.target(android.content.Context::class.java).getSystemService(b.string(b[0]))) }
194
+ "Context#checkPermission(Ljava/lang/String;II)I" -> b.run { b.encode(b.target(android.content.Context::class.java).checkPermission(b.string(b[0]), b.int(b[1]), b.int(b[2]))) }
195
+ "Context#checkCallingPermission(Ljava/lang/String;)I" -> b.run { b.encode(b.target(android.content.Context::class.java).checkCallingPermission(b.string(b[0]))) }
196
+ "Context#checkCallingOrSelfPermission(Ljava/lang/String;)I" -> b.run { b.encode(b.target(android.content.Context::class.java).checkCallingOrSelfPermission(b.string(b[0]))) }
197
+ "Context#enforcePermission(Ljava/lang/String;IILjava/lang/String;)V" -> b.run { b.target(android.content.Context::class.java).enforcePermission(b.string(b[0]), b.int(b[1]), b.int(b[2]), b.optional(b[3]) { x1 -> b.string(x1) }); null }
198
+ "Context#enforceCallingPermission(Ljava/lang/String;Ljava/lang/String;)V" -> b.run { b.target(android.content.Context::class.java).enforceCallingPermission(b.string(b[0]), b.optional(b[1]) { x1 -> b.string(x1) }); null }
199
+ "Context#enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V" -> b.run { b.target(android.content.Context::class.java).enforceCallingOrSelfPermission(b.string(b[0]), b.optional(b[1]) { x1 -> b.string(x1) }); null }
200
+ "Context#createPackageContext(Ljava/lang/String;I)Landroid/content/Context;" -> b.run { b.encode(b.target(android.content.Context::class.java).createPackageContext(b.optional(b[0]) { x1 -> b.string(x1) }, b.int(b[1]))) }
201
+ "Context#isRestricted()Z" -> b.run { if (Build.VERSION.SDK_INT < 4) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).isRestricted()) }
202
+ "Context#getPackageResourcePath()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 8) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getPackageResourcePath()) }
203
+ "Context#getPackageCodePath()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 8) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getPackageCodePath()) }
204
+ "Context#getColor(I)I" -> b.run { if (Build.VERSION.SDK_INT < 23) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getColor(b.int(b[0]))) }
205
+ "Context#checkSelfPermission(Ljava/lang/String;)I" -> b.run { if (Build.VERSION.SDK_INT < 23) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).checkSelfPermission(b.string(b[0]))) }
206
+ "Context#moveSharedPreferencesFrom(Landroid/content/Context;Ljava/lang/String;)Z" -> b.run { if (Build.VERSION.SDK_INT < 24) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).moveSharedPreferencesFrom(b.optional(b[0]) { x1 -> b.obj(x1, android.content.Context::class.java) }, b.optional(b[1]) { x1 -> b.string(x1) })) }
207
+ "Context#deleteSharedPreferences(Ljava/lang/String;)Z" -> b.run { if (Build.VERSION.SDK_INT < 24) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).deleteSharedPreferences(b.optional(b[0]) { x1 -> b.string(x1) })) }
208
+ "Context#moveDatabaseFrom(Landroid/content/Context;Ljava/lang/String;)Z" -> b.run { if (Build.VERSION.SDK_INT < 24) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).moveDatabaseFrom(b.optional(b[0]) { x1 -> b.obj(x1, android.content.Context::class.java) }, b.optional(b[1]) { x1 -> b.string(x1) })) }
209
+ "Context#createDeviceProtectedStorageContext()Landroid/content/Context;" -> b.run { if (Build.VERSION.SDK_INT < 24) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).createDeviceProtectedStorageContext()) }
210
+ "Context#isDeviceProtectedStorage()Z" -> b.run { if (Build.VERSION.SDK_INT < 24) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).isDeviceProtectedStorage()) }
211
+ "Context#createContextForSplit(Ljava/lang/String;)Landroid/content/Context;" -> b.run { if (Build.VERSION.SDK_INT < 26) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).createContextForSplit(b.optional(b[0]) { x1 -> b.string(x1) })) }
212
+ "Context#getMainExecutor()Ljava/util/concurrent/Executor;" -> b.run { if (Build.VERSION.SDK_INT < 28) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getMainExecutor()) }
213
+ "Context#getOpPackageName()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 29) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getOpPackageName()) }
214
+ "Context#getAttributionTag()Ljava/lang/String;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getAttributionTag()) }
215
+ "Context#createAttributionContext(Ljava/lang/String;)Landroid/content/Context;" -> b.run { if (Build.VERSION.SDK_INT < 30) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).createAttributionContext(b.optional(b[0]) { x1 -> b.string(x1) })) }
216
+ "Context#isUiContext()Z" -> b.run { if (Build.VERSION.SDK_INT < 31) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).isUiContext()) }
217
+ "Context#revokeSelfPermissionOnKill(Ljava/lang/String;)V" -> b.run { if (Build.VERSION.SDK_INT < 33) throw TokamakBinding.unavailable; b.target(android.content.Context::class.java).revokeSelfPermissionOnKill(b.string(b[0])); null }
218
+ "Context#revokeSelfPermissionsOnKill(Ljava/util/Collection;)V" -> b.run { if (Build.VERSION.SDK_INT < 33) throw TokamakBinding.unavailable; b.target(android.content.Context::class.java).revokeSelfPermissionsOnKill(b.list(b[0]) { x1 -> b.optional(x1) { x2 -> b.string(x2) } }); null }
219
+ "Context#createDeviceContext(I)Landroid/content/Context;" -> b.run { if (Build.VERSION.SDK_INT < 34) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).createDeviceContext(b.int(b[0]))) }
220
+ "Context#getDeviceId()I" -> b.run { if (Build.VERSION.SDK_INT < 34) throw TokamakBinding.unavailable; b.encode(b.target(android.content.Context::class.java).getDeviceId()) }
221
+ else -> b.unsupported(method)
222
+ }
223
+
224
+ private fun callContext_BindServiceFlags(method: String, b: TokamakBinding): (() -> Unit)? =
225
+ when (method) {
226
+ "Context.BindServiceFlags#of(J)Landroid/content/Context\$BindServiceFlags;" -> b.run { if (Build.VERSION.SDK_INT < 34) throw TokamakBinding.unavailable; b.encode(android.content.Context.BindServiceFlags.of(b.long(b[0]))) }
227
+ else -> b.unsupported(method)
228
+ }
229
+
230
+ private fun callCancellationSignal(method: String, b: TokamakBinding): (() -> Unit)? =
231
+ when (method) {
232
+ "CancellationSignal#<init>()V" -> b.run { if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable; b.encode(android.os.CancellationSignal()) }
233
+ "CancellationSignal#isCanceled()Z" -> b.run { if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable; b.encode(b.target(android.os.CancellationSignal::class.java).isCanceled()) }
234
+ "CancellationSignal#throwIfCanceled()V" -> b.run { if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable; b.target(android.os.CancellationSignal::class.java).throwIfCanceled(); null }
235
+ "CancellationSignal#cancel()V" -> b.run { if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable; b.target(android.os.CancellationSignal::class.java).cancel(); null }
236
+ "CancellationSignal#setOnCancelListener(Landroid/os/CancellationSignal\$OnCancelListener;)V" -> b.run { if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable; b.target(android.os.CancellationSignal::class.java).setOnCancelListener(b.optional(b[0]) { x1 -> b.obj(x1, android.os.CancellationSignal.OnCancelListener::class.java) }); null }
237
+ else -> b.unsupported(method)
238
+ }
239
+
240
+ private fun callCancellationSignal_OnCancelListener(method: String, b: TokamakBinding): (() -> Unit)? =
241
+ when (method) {
242
+ "CancellationSignal.OnCancelListener#onCancel()V" -> b.run { if (Build.VERSION.SDK_INT < 16) throw TokamakBinding.unavailable; b.target(android.os.CancellationSignal.OnCancelListener::class.java).onCancel(); null }
243
+ else -> b.unsupported(method)
244
+ }
245
+
246
+ @androidx.annotation.RequiresApi(28)
247
+ private class BiometricPrompt_AuthenticationCallbackImplementation(private val binding: TokamakBinding) : android.hardware.biometrics.BiometricPrompt.AuthenticationCallback() {
248
+ override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
249
+ if (!binding.call("onAuthenticationError") { b -> listOf(b.encode(errorCode), b.encode(errString)) }) super.onAuthenticationError(errorCode, errString)
250
+ }
251
+
252
+ override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence?) {
253
+ if (!binding.call("onAuthenticationHelp") { b -> listOf(b.encode(helpCode), b.encode(helpString)) }) super.onAuthenticationHelp(helpCode, helpString)
254
+ }
255
+
256
+ override fun onAuthenticationSucceeded(result: android.hardware.biometrics.BiometricPrompt.AuthenticationResult?) {
257
+ if (!binding.call("onAuthenticationSucceeded") { b -> listOf(b.encode(result)) }) super.onAuthenticationSucceeded(result)
258
+ }
259
+
260
+ override fun onAuthenticationFailed() {
261
+ if (!binding.call("onAuthenticationFailed") { b -> listOf() }) super.onAuthenticationFailed()
262
+ }
263
+ }
264
+
265
+ @androidx.annotation.RequiresApi(16)
266
+ private class CancellationSignal_OnCancelListenerImplementation(private val binding: TokamakBinding) : android.os.CancellationSignal.OnCancelListener {
267
+ override fun onCancel() {
268
+ binding.call("onCancel") { b -> listOf() }
269
+ }
270
+ }
271
+ }
@@ -20,12 +20,13 @@ class TokamakLocalAuthenticationPlugin(
20
20
 
21
21
  private val biometrics = host.context.getSystemService(BiometricManager::class.java)
22
22
 
23
- override fun call(method: String, arguments: Any?, reply: TokamakPluginReply) {
23
+ override fun call(method: String, arguments: Any?, reply: TokamakPluginReply): (() -> Unit)? {
24
24
  when (method) {
25
25
  "status" -> reply(Result.success(status(requireObject(arguments))))
26
- "authenticate" -> authenticate(requireObject(arguments), reply)
26
+ "authenticate" -> return authenticate(requireObject(arguments), reply)
27
27
  else -> super.call(method, arguments, reply)
28
28
  }
29
+ return null
29
30
  }
30
31
 
31
32
  private fun status(request: JSONObject): String =
@@ -35,12 +36,12 @@ class TokamakLocalAuthenticationPlugin(
35
36
  else -> "unavailable"
36
37
  }
37
38
 
38
- private fun authenticate(request: JSONObject, reply: TokamakPluginReply) {
39
+ private fun authenticate(request: JSONObject, reply: TokamakPluginReply): () -> Unit {
39
40
  val authenticators = authenticators(request)
40
41
  val prompt = request.requireString("prompt")
41
42
  if (prompt.isEmpty()) throw TokamakPluginError.typeError("prompt must be a non-empty string")
42
43
  host.requireOwnerAuthentication(authenticators)
43
- host.authenticateOwner(prompt, authenticators, null, reply) { reply(Result.success(null)) }
44
+ return host.authenticateOwner(prompt, authenticators, null, reply) { reply(Result.success(null)) }
44
45
  }
45
46
 
46
47
  private fun authenticators(request: JSONObject): Int {