From dcbfadbfb2b4087a08485b05348e4213a6e3d1a7 Mon Sep 17 00:00:00 2001
From: Kamal Bramwell <kamal@elixxir.io>
Date: Tue, 23 Aug 2022 12:50:54 -0400
Subject: [PATCH] Completed Cmix & GroupChat implementations

CmixAdapter and GroupChatAdapter
---
 .../io/elixxir/dapp/bindings/data/Cmix.kt     | 26 ++++++++---
 .../elixxir/dapp/bindings/data/CmixAdapter.kt | 45 ++++++++++++-------
 .../elixxir/dapp/bindings/data/GroupChat.kt   | 13 +++---
 .../dapp/bindings/data/GroupChatAdapter.kt    | 31 ++++++++-----
 .../io/elixxir/dapp/bindings/model/Group.kt   | 11 -----
 .../dapp/bindings/model/GroupAdapter.kt       | 20 +++++++++
 .../elixxir/dapp/bindings/model/GroupInfo.kt  |  7 +++
 .../dapp/bindings/model/GroupMembership.kt    |  4 ++
 .../dapp/bindings/model/GroupReport.kt        |  4 ++
 .../dapp/bindings/model/HealthCallback.kt     | 24 ++++++++++
 .../dapp/bindings/model/HealthListenerId.kt   |  4 ++
 .../bindings/model/NodeRegistrationStatus.kt  |  4 +-
 .../java/io/elixxir/dapp/user/model/User.kt   | 14 +++++-
 13 files changed, 155 insertions(+), 52 deletions(-)
 delete mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/Group.kt
 create mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/GroupAdapter.kt
 create mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/GroupInfo.kt
 create mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/GroupMembership.kt
 create mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/GroupReport.kt
 create mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/HealthCallback.kt
 create mode 100644 app/src/main/java/io/elixxir/dapp/bindings/model/HealthListenerId.kt

diff --git a/app/src/main/java/io/elixxir/dapp/bindings/data/Cmix.kt b/app/src/main/java/io/elixxir/dapp/bindings/data/Cmix.kt
index be20d16..ef91c1f 100644
--- a/app/src/main/java/io/elixxir/dapp/bindings/data/Cmix.kt
+++ b/app/src/main/java/io/elixxir/dapp/bindings/data/Cmix.kt
@@ -1,19 +1,31 @@
 package io.elixxir.dapp.bindings.data
 
-import bindings.ReceptionIdentity
-import io.elixxir.dapp.bindings.model.Connection
+import io.elixxir.dapp.bindings.model.*
+import io.elixxir.dapp.bindings.model.Contact
+import io.elixxir.dapp.bindings.model.E2eId
 import io.elixxir.dapp.bindings.model.NetworkFollowerStatus
-import io.elixxir.dapp.bindings.model.NodeRegistrationStatus
 
 internal interface Cmix {
-    fun connect(): Connection
-    fun startNetworkFollower()
+    fun connect(
+        e2eId: E2eId,
+        recipientContact: Contact,
+        e2eParams: E2eParams
+    ): Connection
+
+    fun startNetworkFollower(timeoutMs: Long)
+
     fun stopNetworkFollower()
+
     fun isNetworkHealthy(): Boolean
-    fun registerHealthCallback()
-    fun unregisterHealthCallback()
+
+    fun registerHealthListener(listener: NetworkHealthListener): HealthListenerId
+
+    fun unregisterHealthListener(id: HealthListenerId)
+
     fun getNodeRegistrationStatus(): NodeRegistrationStatus
+
     fun makeReceptionIdentity(): ReceptionIdentity
+
     fun getNetworkFollowerStatus(): NetworkFollowerStatus
 }
 
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/data/CmixAdapter.kt b/app/src/main/java/io/elixxir/dapp/bindings/data/CmixAdapter.kt
index 61bfbcc..7c7203b 100644
--- a/app/src/main/java/io/elixxir/dapp/bindings/data/CmixAdapter.kt
+++ b/app/src/main/java/io/elixxir/dapp/bindings/data/CmixAdapter.kt
@@ -1,47 +1,62 @@
 package io.elixxir.dapp.bindings.data
 
-import bindings.ReceptionIdentity
+import io.elixxir.dapp.bindings.model.*
 import io.elixxir.dapp.bindings.model.Connection
+import io.elixxir.dapp.bindings.model.Contact
+import io.elixxir.dapp.bindings.model.E2eId
+import io.elixxir.dapp.bindings.model.E2eParams
 import io.elixxir.dapp.bindings.model.NetworkFollowerStatus
-import io.elixxir.dapp.bindings.model.NodeRegistrationStatus
 import bindings.Cmix as CoreCmix
 
 @JvmInline
 internal value class CmixAdapter(private val cmix: CoreCmix) : Cmix {
 
-    override fun connect(): Connection {
-        TODO("Not yet implemented")
+    override fun connect(
+        e2eId: E2eId,
+        recipientContact: Contact,
+        e2eParams: E2eParams
+    ): Connection {
+        // TODO: Use factory method to get Connection implementation
+        return ConnectionAdapter(
+            cmix.connect(
+                e2eId.value,
+                recipientContact.value,
+                e2eParams.value
+            )
+        )
     }
 
-    override fun startNetworkFollower() {
-        TODO("Not yet implemented")
+    override fun startNetworkFollower(timeoutMs: Long) {
+        cmix.startNetworkFollower(timeoutMs)
     }
 
     override fun stopNetworkFollower() {
-        TODO("Not yet implemented")
+        cmix.stopNetworkFollower()
     }
 
     override fun isNetworkHealthy(): Boolean {
-        TODO("Not yet implemented")
+        return cmix.isHealthy
     }
 
-    override fun registerHealthCallback() {
-        TODO("Not yet implemented")
+    override fun registerHealthListener(listener: NetworkHealthListener): HealthListenerId {
+        return HealthListenerId(
+            cmix.addHealthCallback(HealthCallbackAdapter.placeholder)
+        )
     }
 
-    override fun unregisterHealthCallback() {
-        TODO("Not yet implemented")
+    override fun unregisterHealthListener(id: HealthListenerId) {
+        cmix.removeHealthCallback(id.value)
     }
 
     override fun getNodeRegistrationStatus(): NodeRegistrationStatus {
-        TODO("Not yet implemented")
+        return NodeRegistrationStatus(cmix.nodeRegistrationStatus)
     }
 
     override fun makeReceptionIdentity(): ReceptionIdentity {
-        TODO("Not yet implemented")
+        return ReceptionIdentity(cmix.makeReceptionIdentity())
     }
 
     override fun getNetworkFollowerStatus(): NetworkFollowerStatus {
-        TODO("Not yet implemented")
+        return NetworkFollowerStatus.from(cmix.networkFollowerStatus())
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChat.kt b/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChat.kt
index 162e8d7..ff2d4d8 100644
--- a/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChat.kt
+++ b/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChat.kt
@@ -1,11 +1,14 @@
 package io.elixxir.dapp.bindings.data
 
+import io.elixxir.dapp.bindings.model.GroupInfo
+import io.elixxir.dapp.bindings.model.GroupReport
+import io.elixxir.dapp.group.model.Group
 import io.elixxir.dapp.group.model.GroupId
 
 internal interface GroupChat {
-    fun getGroup(groupId: GroupId)
-    fun joinGroup()
-    fun leaveGroup()
-    fun makeGroup()
-    fun resendInvitation()
+    fun getGroup(groupId: GroupId): Group
+    fun joinGroup(trackedGroupId: Long)
+    fun leaveGroup(groupId: GroupId)
+    fun makeGroup(info: GroupInfo): GroupReport
+    fun resendInvitations(group: Group): GroupReport
 }
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChatAdapter.kt b/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChatAdapter.kt
index a2252a9..277bc79 100644
--- a/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChatAdapter.kt
+++ b/app/src/main/java/io/elixxir/dapp/bindings/data/GroupChatAdapter.kt
@@ -1,26 +1,37 @@
 package io.elixxir.dapp.bindings.data
 
+import io.elixxir.dapp.bindings.model.GroupAdapter
+import io.elixxir.dapp.bindings.model.GroupInfo
+import io.elixxir.dapp.bindings.model.GroupReport
+import io.elixxir.dapp.group.model.Group
 import io.elixxir.dapp.group.model.GroupId
 import bindings.GroupChat as CoreGroupChat
 
 internal class GroupChatAdapter(private val groupChat: CoreGroupChat) : GroupChat {
-    override fun getGroup(groupId: GroupId) {
-        TODO("Not yet implemented")
+    override fun getGroup(groupId: GroupId): Group {
+         return GroupAdapter(groupChat.getGroup(groupId.value))
     }
 
-    override fun joinGroup() {
-        TODO("Not yet implemented")
+    override fun joinGroup(trackedGroupId: Long) {
+        groupChat.joinGroup(trackedGroupId)
     }
 
-    override fun leaveGroup() {
-        TODO("Not yet implemented")
+    override fun leaveGroup(groupId: GroupId) {
+        groupChat.leaveGroup(groupId.value)
     }
 
-    override fun makeGroup() {
-        TODO("Not yet implemented")
+    override fun makeGroup(info: GroupInfo): GroupReport {
+        return GroupReport(
+            groupChat.makeGroup(
+                info.membershipData.value,
+                info.description.toByteArray(),
+                info.name.toByteArray())
+        )
     }
 
-    override fun resendInvitation() {
-        TODO("Not yet implemented")
+    override fun resendInvitations(group: Group): GroupReport {
+        return GroupReport(
+            groupChat.resendRequest(group.groupId.value)
+        )
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/Group.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/Group.kt
deleted file mode 100644
index 1bf99c9..0000000
--- a/app/src/main/java/io/elixxir/dapp/bindings/model/Group.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package io.elixxir.dapp.bindings.model
-
-import io.elixxir.dapp.group.model.GroupId
-
-internal interface Group {
-    val id: GroupId
-    val name: String
-    val initMessage: String
-    val members: List<String>
-    val creationTimeMs: Long
-}
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/GroupAdapter.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupAdapter.kt
new file mode 100644
index 0000000..07a97a7
--- /dev/null
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupAdapter.kt
@@ -0,0 +1,20 @@
+package io.elixxir.dapp.bindings.model
+
+import io.elixxir.dapp.group.model.Group
+import io.elixxir.dapp.group.model.GroupId
+import io.elixxir.dapp.user.model.User
+import bindings.Group as CoreGroup
+
+@JvmInline
+internal value class GroupAdapter(val value: CoreGroup): Group {
+    override val groupId: GroupId
+        get() = GroupId(value.id)
+    override val name: String
+        get() = String(value.name)
+    override val description: String
+        get() = String(value.initMessage)
+    override val members: List<User>
+        get() = listOf()
+    override val creator: User
+        get() = User.placeholder
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/GroupInfo.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupInfo.kt
new file mode 100644
index 0000000..84b84dd
--- /dev/null
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupInfo.kt
@@ -0,0 +1,7 @@
+package io.elixxir.dapp.bindings.model
+
+internal data class GroupInfo(
+    val membershipData: GroupMembership,
+    val description: String,
+    val name: String
+)
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/GroupMembership.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupMembership.kt
new file mode 100644
index 0000000..04c32bf
--- /dev/null
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupMembership.kt
@@ -0,0 +1,4 @@
+package io.elixxir.dapp.bindings.model
+
+@JvmInline
+internal value class GroupMembership(val value: ByteArray)
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/GroupReport.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupReport.kt
new file mode 100644
index 0000000..c70edbb
--- /dev/null
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/GroupReport.kt
@@ -0,0 +1,4 @@
+package io.elixxir.dapp.bindings.model
+
+@JvmInline
+internal value class GroupReport(val value: ByteArray)
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/HealthCallback.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/HealthCallback.kt
new file mode 100644
index 0000000..bc5aec4
--- /dev/null
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/HealthCallback.kt
@@ -0,0 +1,24 @@
+package io.elixxir.dapp.bindings.model
+
+internal interface NetworkHealthListener {
+    fun onHealthChanged(isHealthy: Boolean)
+}
+
+internal class HealthCallbackAdapter(
+    private val listener: NetworkHealthListener
+) : NetworkHealthListener by listener,
+    bindings.NetworkHealthCallback
+{
+    override fun callback(isHealthy: Boolean) {
+        onHealthChanged(isHealthy)
+    }
+
+    companion object {
+        val placeholder: HealthCallbackAdapter =
+            HealthCallbackAdapter(
+                object : NetworkHealthListener {
+                    override fun onHealthChanged(isHealthy: Boolean) { }
+                }
+            )
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/HealthListenerId.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/HealthListenerId.kt
new file mode 100644
index 0000000..5034d68
--- /dev/null
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/HealthListenerId.kt
@@ -0,0 +1,4 @@
+package io.elixxir.dapp.bindings.model
+
+@JvmInline
+internal value class HealthListenerId(val value: Long)
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/bindings/model/NodeRegistrationStatus.kt b/app/src/main/java/io/elixxir/dapp/bindings/model/NodeRegistrationStatus.kt
index 90fb610..620eee5 100644
--- a/app/src/main/java/io/elixxir/dapp/bindings/model/NodeRegistrationStatus.kt
+++ b/app/src/main/java/io/elixxir/dapp/bindings/model/NodeRegistrationStatus.kt
@@ -1,4 +1,4 @@
 package io.elixxir.dapp.bindings.model
 
-class NodeRegistrationStatus {
-}
\ No newline at end of file
+@JvmInline
+internal value class NodeRegistrationStatus(val value: ByteArray)
\ No newline at end of file
diff --git a/app/src/main/java/io/elixxir/dapp/user/model/User.kt b/app/src/main/java/io/elixxir/dapp/user/model/User.kt
index 056dbd6..c24e223 100644
--- a/app/src/main/java/io/elixxir/dapp/user/model/User.kt
+++ b/app/src/main/java/io/elixxir/dapp/user/model/User.kt
@@ -3,6 +3,16 @@ package io.elixxir.dapp.user.model
 interface User {
     val userId: Long
     val username: String
-    val phone: String
-    val email: String
+    val phone: String?
+    val email: String?
+
+    companion object {
+        val placeholder = object : User {
+            override val userId: Long = 0
+            override val username: String = ""
+            override val phone: String? = null
+            override val email: String? = null
+
+        }
+    }
 }
\ No newline at end of file
-- 
GitLab