@@ -2,6 +2,10 @@ package com.android.identity.wallet
2
2
3
3
import android.app.Application
4
4
import android.content.Context
5
+ import android.content.Intent
6
+ import android.content.IntentFilter
7
+ import com.android.identity.android.direct_access.DirectAccess
8
+ import com.android.identity.android.direct_access.DirectAccessCredential
5
9
import com.android.identity.android.securearea.AndroidKeystoreSecureArea
6
10
import com.android.identity.android.storage.AndroidStorageEngine
7
11
import com.android.identity.android.util.AndroidLogPrinter
@@ -22,17 +26,19 @@ import com.android.identity.trustmanagement.TrustManager
22
26
import com.android.identity.trustmanagement.TrustPoint
23
27
import com.android.identity.util.Logger
24
28
import com.android.identity.wallet.document.KeysAndCertificates
29
+ import com.android.identity.wallet.dynamicregistration.PowerOffReceiver
25
30
import com.android.identity.wallet.util.PeriodicKeysRefreshWorkRequest
26
31
import com.android.identity.wallet.util.PreferencesHelper
27
32
import com.google.android.material.color.DynamicColors
28
- import kotlinx.io.files.Path
29
33
import org.bouncycastle.jce.provider.BouncyCastleProvider
30
34
import java.io.ByteArrayInputStream
31
35
import java.security.Security
32
36
import java.security.cert.CertificateFactory
33
37
import java.security.cert.X509Certificate
38
+ import kotlinx.io.files.Path
34
39
35
40
class HolderApp : Application () {
41
+ private lateinit var powerOffReceiver: PowerOffReceiver
36
42
37
43
private val documentTypeRepository by lazy {
38
44
DocumentTypeRepository ()
@@ -70,17 +76,32 @@ class HolderApp: Application() {
70
76
KeysAndCertificates .getTrustedReaderCertificates(this ).forEach {
71
77
trustManagerInstance.addTrustPoint(TrustPoint (X509Cert (it.encoded)))
72
78
}
79
+ powerOffReceiver = PowerOffReceiver ()
80
+ registerReceiver(powerOffReceiver, IntentFilter (Intent .ACTION_SHUTDOWN ))
81
+ }
82
+
83
+ override fun onTerminate () {
84
+ super .onTerminate()
85
+ unregisterReceiver(powerOffReceiver)
73
86
}
74
87
75
88
companion object {
76
89
77
90
lateinit var documentTypeRepositoryInstance: DocumentTypeRepository
78
91
lateinit var trustManagerInstance: TrustManager
79
92
lateinit var certificateStorageEngineInstance: StorageEngine
93
+ // Use lazy access to prevent delays at app startup when DirectAccessOmapiTransport needs to
94
+ // wait for connection to SE.
95
+ val isDirectAccessSupported by lazy {
96
+ DirectAccess .isDirectAccessSupported
97
+ }
98
+
80
99
fun createDocumentStore (
81
100
context : Context ,
82
- secureAreaRepository : SecureAreaRepository
101
+ secureAreaRepository : SecureAreaRepository ,
83
102
): DocumentStore {
103
+ DirectAccess .warmupTransport()
104
+
84
105
val storageFile = Path (PreferencesHelper .getKeystoreBackedStorageLocation(context).path)
85
106
val storageEngine = AndroidStorageEngine .Builder (context, storageFile).build()
86
107
@@ -90,11 +111,17 @@ class HolderApp: Application() {
90
111
secureAreaRepository.addImplementation(androidKeystoreSecureArea)
91
112
secureAreaRepository.addImplementation(softwareSecureArea)
92
113
93
- var credentialFactory = CredentialFactory ()
114
+ val credentialFactory = CredentialFactory ()
94
115
credentialFactory.addCredentialImplementation(MdocCredential ::class ) {
95
116
document, dataItem -> MdocCredential (document, dataItem)
96
117
}
97
- return DocumentStore (storageEngine, secureAreaRepository, credentialFactory)
118
+ credentialFactory.addCredentialImplementation(DirectAccessCredential ::class ) {
119
+ document, dataItem -> DirectAccessCredential (document, dataItem)
120
+ }
121
+ return DocumentStore (
122
+ storageEngine,
123
+ secureAreaRepository,
124
+ credentialFactory)
98
125
}
99
126
}
100
127
0 commit comments