Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion MultipazCodelab/Holder/composeApp/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ kotlin {
androidTarget {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
jvmTarget.set(JvmTarget.JVM_17)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,16 +118,6 @@
requests on the lock screen because there is no PII. For an app with real
user data it might be a privacy problem to show PII on the lock screen.
-->
<activity
android:name=".NfcActivity"
android:showWhenLocked="true"
android:turnScreenOn="true"
android:exported="true"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden|mnc|colorMode|density|fontScale|fontWeightAdjustment|keyboard|layoutDirection|locale|mcc|navigation|smallestScreenSize|touchscreen|uiMode"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
android:launchMode="singleInstance">
</activity>

<service
android:name=".NdefService"
android:exported="true"
Expand All @@ -143,4 +133,4 @@
</service>
</application>

</manifest>
</manifest>
Original file line number Diff line number Diff line change
@@ -1,31 +1,16 @@
package org.multipaz.samples.wallet.cmp

import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import coil3.ImageLoader
import org.koin.android.ext.android.inject
import org.multipaz.compose.digitalcredentials.CredentialManagerPresentmentActivity
import org.multipaz.documenttype.DocumentTypeRepository
import org.multipaz.presentment.model.PresentmentSource
import org.multipaz.prompt.PromptModel
import org.multipaz.samples.wallet.cmp.util.Constants.APP_NAME
import org.multipaz.samples.wallet.cmp.util.Constants.appIcon
import utopiasample.composeapp.generated.resources.Res

class CredmanActivity : CredentialManagerPresentmentActivity() {
private val promptModel: PromptModel by inject()
private val documentTypeRepository: DocumentTypeRepository by inject()
private val presentmentSource: PresentmentSource by inject()

override suspend fun getSettings(): Settings {
return Settings(
appName = APP_NAME,
appIcon = appIcon,
promptModel = promptModel,
applicationTheme = @Composable { content -> MaterialTheme { content() } },
documentTypeRepository = documentTypeRepository,
presentmentSource = presentmentSource,
imageLoader = ImageLoader.Builder(applicationContext).components { /* network loader omitted */ }.build(),
source = presentmentSource,
privilegedAllowList = Res.readBytes("files/privilegedUserAgents.json").decodeToString(),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,29 @@ package org.multipaz.samples.wallet.cmp

import org.koin.android.ext.android.inject
import org.multipaz.compose.mdoc.MdocNdefService
import org.multipaz.compose.prompt.PresentmentActivity
import org.multipaz.mdoc.transport.MdocTransportOptions
import org.multipaz.prompt.PromptModel
import org.multipaz.presentment.model.PresentmentSource
import org.multipaz.samples.wallet.cmp.util.AppSettingsModel
import org.multipaz.util.Platform

class NdefService : MdocNdefService() {
private lateinit var settingsModel: AppSettingsModel
private val promptModel: PromptModel by inject()
private val presentmentSource: PresentmentSource by inject()
private val settingsModel: AppSettingsModel by inject()

override suspend fun getSettings(): Settings {
settingsModel =
AppSettingsModel.create(
storage = Platform.storage,
readOnly = true,
)
// Reset the presentment model with the source's document store and repository
PresentmentActivity.presentmentModel.reset(
documentStore = presentmentSource.documentStore,
documentTypeRepository = presentmentSource.documentTypeRepository,
preselectedDocuments = emptyList(),
)

return Settings(
source = presentmentSource,
promptModel = PresentmentActivity.promptModel,
presentmentModel = PresentmentActivity.presentmentModel,
activityClass = PresentmentActivity::class.java,
sessionEncryptionCurve = settingsModel.presentmentSessionEncryptionCurve.value,
allowMultipleRequests = settingsModel.presentmentAllowMultipleRequests.value,
useNegotiatedHandover = settingsModel.presentmentUseNegotiatedHandover.value,
negotiatedHandoverPreferredOrder = settingsModel.presentmentNegotiatedHandoverPreferredOrder.value,
staticHandoverBleCentralClientModeEnabled = settingsModel.presentmentBleCentralClientModeEnabled.value,
Expand All @@ -32,8 +36,6 @@ class NdefService : MdocNdefService() {
bleUseL2CAP = settingsModel.presentmentBleL2CapEnabled.value,
bleUseL2CAPInEngagement = settingsModel.presentmentBleL2CapInEngagementEnabled.value,
),
promptModel = promptModel,
presentmentActivityClass = NfcActivity::class.java,
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,11 @@ package org.multipaz.samples.wallet.cmp.di
import io.ktor.client.HttpClient
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.io.bytestring.ByteString
import org.koin.dsl.module
import org.multipaz.crypto.Algorithm
import org.multipaz.crypto.X509Cert
import org.multipaz.digitalcredentials.Default
import org.multipaz.digitalcredentials.DigitalCredentials
import org.multipaz.document.DocumentMetadata
import org.multipaz.digitalcredentials.getDefault
import org.multipaz.document.DocumentStore
import org.multipaz.document.buildDocumentStore
import org.multipaz.documenttype.DocumentTypeRepository
Expand All @@ -19,10 +17,12 @@ import org.multipaz.presentment.model.PresentmentModel
import org.multipaz.presentment.model.PresentmentSource
import org.multipaz.presentment.model.SimplePresentmentSource
import org.multipaz.prompt.PromptModel
import org.multipaz.provisioning.DocumentProvisioningHandler
import org.multipaz.provisioning.ProvisioningModel
import org.multipaz.provisioning.openid4vci.OpenID4VCIBackend
import org.multipaz.provisioning.openid4vci.OpenID4VCIClientPreferences
import org.multipaz.rpc.handler.RpcAuthClientSession
import org.multipaz.samples.wallet.cmp.util.AppSettingsModel
import org.multipaz.samples.wallet.cmp.util.OpenID4VCILocalBackend
import org.multipaz.samples.wallet.cmp.util.ProvisioningSupport
import org.multipaz.samples.wallet.cmp.util.ProvisioningSupport.Companion.APP_LINK_BASE_URL
Expand Down Expand Up @@ -68,23 +68,25 @@ val multipazModule =
followRedirects = false
}
}
single<AppSettingsModel> {
runBlocking {
AppSettingsModel.create(
storage = get(),
readOnly = false,
)
}
}
single<ProvisioningModel> {
val secureArea: SecureArea = get()
ProvisioningModel(
documentStore = get(),
secureArea = get(),
documentProvisioningHandler =
DocumentProvisioningHandler(
secureArea = secureArea,
documentStore = get(),
),
httpClient = get(),
promptModel = get(),
documentMetadataInitializer = { metadata, credentialDisplay, issuerDisplay ->
(metadata as DocumentMetadata).setMetadata(
displayName = credentialDisplay.text,
typeDisplayName = credentialDisplay.text,
cardArt =
credentialDisplay.logo
?: ByteString(Res.readBytes("drawable/profile.png")),
issuerLogo = issuerDisplay.logo,
other = null,
)
},
authorizationSecureArea = secureArea,
)
}

Expand Down Expand Up @@ -154,8 +156,9 @@ val multipazModule =

single<PresentmentSource> {
runBlocking {
if (DigitalCredentials.Default.available) {
DigitalCredentials.Default.startExportingCredentials(
val digitalCredentials = DigitalCredentials.getDefault()
if (digitalCredentials.registerAvailable) {
digitalCredentials.register(
documentStore = get(),
documentTypeRepository = get(),
)
Expand All @@ -164,7 +167,6 @@ val multipazModule =
SimplePresentmentSource(
documentStore = get(),
documentTypeRepository = get(),
readerTrustManager = get(),
preferSignatureToKeyAgreement = true,
// Match domains used when storing credentials via OpenID4VCI
domainMdocSignature = TestAppUtils.CREDENTIAL_DOMAIN_MDOC_USER_AUTH,
Expand Down Expand Up @@ -203,8 +205,6 @@ val multipazModule =
}

single<PresentmentModel> {
PresentmentModel().apply {
setPromptModel(get())
}
PresentmentModel()
}
}
Loading