diff --git a/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt b/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt index f021394b32091e248c0ee6f6a390ab18d113bae2..1f3546e6e428bb12641a6a96477509a1b15e52e0 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt @@ -26,7 +26,7 @@ interface Bindings { fun downloadAndVerifySignedNdf( environmentUrl: String, certificate: Certificate, - ): Ndf + ): Ndf? fun generateSecret(byteLength: Long): Password @@ -34,7 +34,7 @@ interface Bindings { sessionFileDirectory: String, sessionPassword: Password, cmixParams: CmixParams - ): CMix + ): CMix? fun newCmix( ndfJson: String, @@ -114,7 +114,7 @@ interface Bindings { fun getReceptionIdentity( key: String, e2eId: E2eId - ): ReceptionIdentity + ): ReceptionIdentity? fun newFileTransferManager( e2eId: E2eId, @@ -125,7 +125,7 @@ interface Bindings { fun getIdFromContact(contactData: ContactData): ByteArray fun getPublicKeyFromContact(contactData: ContactData): ByteArray - fun getFactsFromContact(contactData: ContactData): Fact + fun getFactsFromContact(contactData: ContactData): List<Fact> fun setFactsOnContact(contactData: ContactData, fact: Fact): ContactData fun searchUd( @@ -134,7 +134,7 @@ interface Bindings { listener: UdSearchResultListener, factsListJson: ByteArray, singleRequestParamsJson: ByteArray - ): SingleUseReport + ): SingleUseReport? fun lookupUd( e2eId: E2eId, @@ -142,7 +142,7 @@ interface Bindings { listener: UdLookupResultListener, lookupId: UserId, singleRequestParamsJson: ByteArray - ): SingleUseReport + ): SingleUseReport? fun multiLookupUd( e2eId: E2eId, @@ -167,7 +167,7 @@ interface Bindings { payload: Payload, paramsJson: ByteArray, listener: SingleUseResponseListener - ): SingleUseReport + ): SingleUseReport? fun updateCommonErrors(errorsJson: String) diff --git a/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt b/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt index ad63bf4299ab275a4bc6d76e96bbb3fd6cdff7b5..d3138cb63dbb8fc502567fb1e98e64a112512b97 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt @@ -1,6 +1,5 @@ package io.elixxir.xxclient.bindings -import bindings.GroupChatProcessor import io.elixxir.xxclient.backup.Backup import io.elixxir.xxclient.backup.BackupAdapter import io.elixxir.xxclient.callbacks.* @@ -22,6 +21,7 @@ import io.elixxir.xxclient.groupchat.GroupChat import io.elixxir.xxclient.groupchat.GroupChatAdapter import io.elixxir.xxclient.models.* import io.elixxir.xxclient.models.BindingsModel.Companion.decode +import io.elixxir.xxclient.models.BindingsModel.Companion.decodeArray import io.elixxir.xxclient.models.BindingsModel.Companion.encode import io.elixxir.xxclient.models.ReceiveFileCallbackAdapter import io.elixxir.xxclient.userdiscovery.UserDiscovery @@ -48,7 +48,7 @@ open class BindingsAdapter : Bindings { override fun downloadAndVerifySignedNdf( environmentUrl: String, certificate: Certificate - ): Ndf { + ): Ndf? { return CoreBindings.downloadAndVerifySignedNdfWithUrl(environmentUrl, certificate) } @@ -233,7 +233,7 @@ open class BindingsAdapter : Bindings { ) } - override fun getReceptionIdentity(key: String, e2eId: E2eId): ReceptionIdentity { + override fun getReceptionIdentity(key: String, e2eId: E2eId): ReceptionIdentity? { return decode( CoreBindings.loadReceptionIdentity(key, e2eId) ) @@ -263,8 +263,8 @@ open class BindingsAdapter : Bindings { return CoreBindings.getPubkeyFromContact(contactData) } - override fun getFactsFromContact(contactData: ContactData): Fact { - return decode( + override fun getFactsFromContact(contactData: ContactData): List<Fact> { + return decodeArray( CoreBindings.getFactsFromContact(contactData) ) } @@ -279,7 +279,7 @@ open class BindingsAdapter : Bindings { listener: UdSearchResultListener, factsListJson: ByteArray, singleRequestParamsJson: ByteArray - ): SingleUseReport { + ): SingleUseReport? { val result = CoreBindings.searchUD( e2eId, udContact.encoded(), @@ -296,7 +296,7 @@ open class BindingsAdapter : Bindings { listener: UdLookupResultListener, lookupId: UserId, singleRequestParamsJson: ByteArray - ): SingleUseReport { + ): SingleUseReport? { val result = CoreBindings.lookupUD( e2eId, udContact.encoded(), @@ -348,7 +348,7 @@ open class BindingsAdapter : Bindings { payload: Payload, paramsJson: ByteArray, listener: SingleUseResponseListener - ): SingleUseReport { + ): SingleUseReport? { val result = CoreBindings.transmitSingleUse( e2eId, recipient.encoded(), diff --git a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt index 9fdedbd5af1e4279808e2592f9fc2e1cf653aa74..05d55117803cf848f13ebdddf8de9e2bdacff81e 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt @@ -14,8 +14,8 @@ open class BroadcastListenerAdapter( ) : BroadcastListener by listener, BroadcastListenerBindings { override fun callback(data: ByteArray?, error: Exception?) { - listener.onBroadcast( - parseModel(data, error) - ) + parseModel<BroadcastMessage>(data, error).let { + listener.onBroadcast(it) + } } } \ No newline at end of file diff --git a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt index 839adc7ed1b86523b86b288bb6e13edadfccce14..f71485b7c894b870f346f9cb119936849b6bafc3 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt @@ -13,10 +13,10 @@ open class MessageListenerAdapter( protected val listener: MessageListener ) : Listener { override fun hear(message: ByteArray?) { - message?.let { - listener.onMessageReceived( - decode(it) - ) + message?.let { data -> + decode<Message>(data)?.let { + listener.onMessageReceived(it) + } } } diff --git a/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt b/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt index 5bd52e4b868e585229e8b09054ec54471f602ff8..e1046d1838a0ace88791e274d2df6dc6c5cc8c35 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt @@ -12,9 +12,9 @@ interface Channel { val maxAsymmetricPayloadSize: Long val maxPayloadSize: Long - fun broadcast(payload: Payload): BroadcastReport - fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport - fun get(): ChannelDef + fun broadcast(payload: Payload): BroadcastReport? + fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport? + fun get(): ChannelDef? fun listen(channel: Long, listener: BroadcastListener) fun stop() } @@ -25,19 +25,19 @@ open class ChannelAdapter(protected val channel: BindingsChannel) : Channel { override val maxPayloadSize: Long get() = channel.maxPayloadSize() - override fun broadcast(payload: Payload): BroadcastReport { + override fun broadcast(payload: Payload): BroadcastReport? { return decode( channel.broadcast(payload) ) } - override fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport { + override fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport? { return decode( channel.broadcastAsymmetric(payload, privateKey) ) } - override fun get(): ChannelDef { + override fun get(): ChannelDef? { return decode( channel.get() ) diff --git a/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt b/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt index 8cddba19c2aa53489d76b264781262dd13932524..8552e5d2705b4889107c45bbee216f031f694f1f 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt @@ -15,9 +15,9 @@ interface CMix { val receptionRegistrationValidationSignature: ByteArray fun makeReceptionIdentity(): ByteArray - fun makeLegacyReceptionIdentity(): ReceptionIdentity + fun makeLegacyReceptionIdentity(): ReceptionIdentity? fun isNetworkHealthy(): Boolean - fun getNodeRegistrationStatus(): NodeRegistrationReport + fun getNodeRegistrationStatus(): NodeRegistrationReport? fun hasRunningProcesses(): Boolean fun getNetworkFollowerStatus(): NetworkFollowerStatus fun startNetworkFollower(timeoutMs: Long) @@ -49,7 +49,7 @@ open class CMixAdapter(protected val cMix: CMixBindings) : CMix { return cMix.makeReceptionIdentity() } - override fun makeLegacyReceptionIdentity(): ReceptionIdentity { + override fun makeLegacyReceptionIdentity(): ReceptionIdentity? { return decode( cMix.makeLegacyReceptionIdentity() ) @@ -59,7 +59,7 @@ open class CMixAdapter(protected val cMix: CMixBindings) : CMix { return cMix.isHealthy } - override fun getNodeRegistrationStatus(): NodeRegistrationReport { + override fun getNodeRegistrationStatus(): NodeRegistrationReport? { return decode( cMix.nodeRegistrationStatus ) diff --git a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt index 552a2bd278e106d9541b43cbe504ae6201b362d2..3d181eb523fa40eb7b9733e06abc8c0cda9711bc 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt @@ -33,7 +33,7 @@ interface E2e { fun resetAuthenticatedChannel(contact: Contact): RoundId fun callAllReceivedRequests() - fun getReceivedRequest(partnerId: UserId): Request + fun getReceivedRequest(partnerId: UserId): Request? fun deleteRequest(partnerId: UserId) fun deleteAllRequests() fun deleteReceivedRequests() @@ -54,7 +54,7 @@ interface E2e { receiverId: UserId, payload: Payload, params: E2eParams - ): SendReport + ): SendReport? fun registerListener( senderId: UserId, diff --git a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt index 464bead1fa42e25a17f3d81ff9b340a6f6fd50fe..532165c97baabf7293bc397c2588d369a0df867a 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt @@ -75,7 +75,7 @@ open class E2eAdapter(protected val e2e: E2eBindings) : E2e{ e2e.callAllReceivedRequests() } - override fun getReceivedRequest(partnerId: UserId): Request { + override fun getReceivedRequest(partnerId: UserId): Request? { return decode( e2e.getReceivedRequest(partnerId) ) @@ -122,7 +122,7 @@ open class E2eAdapter(protected val e2e: E2eBindings) : E2e{ receiverId: UserId, payload: Payload, params: E2eParams - ): SendReport { + ): SendReport? { val reportData = e2e.sendE2E( messageType.code, receiverId, diff --git a/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt b/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt index b8e2ac2449a9fa1e96fd7bd02b370feac8ace369..814ceb288cdb94e9a28deba4ef835d546382fc34 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt @@ -13,11 +13,11 @@ interface GroupChat { fun getGroup(groupId: ByteArray): Group fun getGroups(): List<Group> - fun makeGroup(membership: ByteArray, message: ByteArray, name: ByteArray): GroupReport + fun makeGroup(membership: ByteArray, message: ByteArray, name: ByteArray): GroupReport? fun joinGroup(trackedGroupId: ByteArray) fun leaveGroup(groupId: ByteArray) - fun resendRequest(groupId: ByteArray): GroupReport - fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport + fun resendRequest(groupId: ByteArray): GroupReport? + fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport? } open class GroupChatAdapter( @@ -40,7 +40,7 @@ open class GroupChatAdapter( membership: ByteArray, message: ByteArray, name: ByteArray - ): GroupReport { + ): GroupReport? { return decode( group.makeGroup(membership, message, name) ) @@ -54,13 +54,13 @@ open class GroupChatAdapter( group.leaveGroup(groupId) } - override fun resendRequest(groupId: ByteArray): GroupReport { + override fun resendRequest(groupId: ByteArray): GroupReport? { return decode( group.resendRequest(groupId) ) } - override fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport { + override fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport? { return decode( group.send(groupId, message, tag) ) diff --git a/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt b/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt index 509e505089d3d5b17e705005c55fe0864949d193..16b02dfb080d681f4c85915cf513c9ca2b4b5ecb 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt @@ -17,13 +17,13 @@ interface BindingsModel { return Gson().toJson(list.toTypedArray(), typeToken).encodeToByteArray() } - inline fun <reified T> decode(data: ByteArray): T { + inline fun <reified T> decode(data: ByteArray): T? { return if (data.isNotEmpty()) { val typeToken = object : TypeToken<T>() {}.type Gson().fromJson(data.decodeToString(), typeToken) } else { Log.d("Decode", "Failed to decode data: ${data.decodeToString()}") - throw InvalidDataException() + null } } diff --git a/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt b/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt index 2198c2d43c94812cefd9360037d96e677612de39..999119aaf26b6f8c8d34d8de255ff73347be91b1 100644 --- a/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt +++ b/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt @@ -10,8 +10,9 @@ inline fun <reified T: BindingsModel> parseModel(data: ByteArray?, error: Except return error?.let { Result.failure(it) } ?: data?.let { - if (it.isNotEmpty()) Result.success(BindingsModel.decode(it)) - else Result.failure(NoResultsException()) + BindingsModel.decode<T>(it)?.let { model -> + Result.success(model) + } ?: Result.failure(NoResultsException()) } ?: Result.failure(InvalidDataException()) }