From dce9d7d4f2332e58a629409ab5e4c36835c6bdb4 Mon Sep 17 00:00:00 2001
From: Kamal Bramwell <kamal@elixxir.io>
Date: Thu, 27 Oct 2022 13:36:48 -0400
Subject: [PATCH] Added nullable return values

---
 .../io/elixxir/xxclient/bindings/Bindings.kt     | 14 +++++++-------
 .../elixxir/xxclient/bindings/BindingsAdapter.kt | 16 ++++++++--------
 .../xxclient/callbacks/BroadcastListener.kt      |  6 +++---
 .../xxclient/callbacks/MessageListener.kt        |  8 ++++----
 .../java/io/elixxir/xxclient/channel/Channel.kt  | 12 ++++++------
 .../main/java/io/elixxir/xxclient/cmix/CMix.kt   |  8 ++++----
 .../src/main/java/io/elixxir/xxclient/e2e/E2e.kt |  4 ++--
 .../java/io/elixxir/xxclient/e2e/E2eAdapter.kt   |  4 ++--
 .../io/elixxir/xxclient/groupchat/GroupChat.kt   | 12 ++++++------
 .../io/elixxir/xxclient/models/BindingsModel.kt  |  4 ++--
 .../java/io/elixxir/xxclient/utils/Bindings.kt   |  5 +++--
 11 files changed, 47 insertions(+), 46 deletions(-)

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 f021394..1f3546e 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 ad63bf4..d3138cb 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 9fdedbd..05d5511 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 839adc7..f71485b 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 5bd52e4..e1046d1 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 8cddba1..8552e5d 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 552a2bd..3d181eb 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 464bead..532165c 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 b8e2ac2..814ceb2 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 509e505..16b02df 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 2198c2d..999119a 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())
 }
 
-- 
GitLab