From 0374d7a16c7e099a739dc7eefe0c482bd5bdf55f Mon Sep 17 00:00:00 2001
From: Anton Weber <anton@antweb.me>
Date: Thu, 22 Aug 2019 12:13:26 +0200
Subject: [PATCH] Fix listener handling.

---
 .../badge/card10/common/ConnectionService.kt       | 14 +++++++-------
 .../ccc/events/badge/card10/common/GattListener.kt |  2 +-
 .../card10/filetransfer/BatchTransferFragment.kt   |  9 ++++-----
 .../badge/card10/filetransfer/FileTransfer.kt      |  4 ++--
 .../badge/card10/filetransfer/LowEffortService.kt  | 10 +++++-----
 5 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt b/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
index 007473b..a5d97c3 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
@@ -42,7 +42,7 @@ object ConnectionService {
     private var connection: BluetoothGatt? = null
 
     private var connectionState = BluetoothGatt.STATE_DISCONNECTED
-    private var gattListeners = mutableListOf<GattListener>()
+    private var gattListeners = mutableMapOf<String, GattListener>()
 
     private val fileServiceUuid = UUID.fromString("42230100-2342-2342-2342-234223422342")
 
@@ -58,8 +58,8 @@ object ConnectionService {
 
     fun isConnected() = connectionState == BluetoothGatt.STATE_CONNECTED
 
-    fun addGattListener(listener: GattListener) {
-        gattListeners.add(listener)
+    fun addGattListener(tag: String, listener: GattListener) {
+        gattListeners[tag] = listener
     }
 
     fun connect(context: Context) {
@@ -113,8 +113,6 @@ object ConnectionService {
             connectionState = newState
             connection = gatt
 
-            gattListeners.map { it.onConnectionStateChange(newState) }
-
             when (newState) {
                 BluetoothGatt.STATE_CONNECTED -> {
                     gatt?.discoverServices()
@@ -132,6 +130,8 @@ object ConnectionService {
             mtu = newMtu - 3 // Very precise science
 
             leService?.enableNotify(gatt)
+
+            gattListeners.values.map { it.onConnectionReady() }
         }
 
         override fun onCharacteristicWrite(
@@ -145,7 +145,7 @@ object ConnectionService {
 
             connection = gatt
 
-            gattListeners.map { it.onCharacteristicWrite(characteristic, status) }
+            gattListeners.values.map { it.onCharacteristicWrite(characteristic, status) }
         }
 
         override fun onCharacteristicChanged(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?) {
@@ -155,7 +155,7 @@ object ConnectionService {
                 throw IllegalStateException()
             }
 
-            gattListeners.map { it.onCharacteristicChanged(characteristic) }
+            gattListeners.values.map { it.onCharacteristicChanged(characteristic) }
         }
     }
 
diff --git a/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt b/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
index a05fd2c..0dc4b75 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
@@ -27,5 +27,5 @@ import android.bluetooth.BluetoothGattCharacteristic
 interface GattListener {
     fun onCharacteristicWrite(characteristic: BluetoothGattCharacteristic, status: Int) {}
     fun onCharacteristicChanged(characteristic: BluetoothGattCharacteristic) {}
-    fun onConnectionStateChange(state: Int) {}
+    fun onConnectionReady() {}
 }
\ No newline at end of file
diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
index 946f593..5fd1fd1 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
@@ -77,7 +77,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
 
     private fun initConnection() {
         val ctx = context ?: throw IllegalStateException()
-        ConnectionService.addGattListener(this)
+        ConnectionService.addGattListener("batchfiletransfer", this)
         ConnectionService.connect(ctx)
     }
 
@@ -91,6 +91,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
     }
 
     private fun transferNext() {
+        Thread.sleep(1000)
         val item = queue.dequeue()
 
         if (item == null || isCancelled) {
@@ -122,10 +123,8 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
         }
     }
 
-    override fun onConnectionStateChange(state: Int) {
-        if (state == BluetoothGatt.STATE_CONNECTED) {
-            startTransfer()
-        }
+    override fun onConnectionReady() {
+        startTransfer()
     }
 
     override fun onError() {
diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
index 413fdc6..1ce6120 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
@@ -41,7 +41,7 @@ class FileTransfer(
     private var currentState = TransferState.IDLE
 
     init {
-        service.addOnPacketReceivedListener(this)
+        service.setOnPacketReceivedListener(this)
     }
 
     override fun onPacketReceived(packet: Packet) {
@@ -98,13 +98,13 @@ class FileTransfer(
             throw IllegalStateException()
         }
 
+        currentState = TransferState.START_SENT
         service.sendPacket(
             Packet(
                 PacketType.START,
                 destinationPath.toByteArray(Charset.forName("ASCII"))
             )
         )
-        currentState = TransferState.START_SENT
     }
 
     private fun sendNext() {
diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
index d76380b..c77e23c 100644
--- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
+++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
@@ -43,7 +43,7 @@ class LowEffortService(
     private val centralRxCharacteristicUuid = UUID.fromString("42230102-2342-2342-2342-234223422342")
 
     private var notifyEnabled = false
-    private val listeners = mutableListOf<OnPacketReceivedListener>()
+    private var listener: OnPacketReceivedListener? = null
 
     init {
         val tx = service.getCharacteristic(centralTxCharacteristicUuid)
@@ -58,7 +58,7 @@ class LowEffortService(
         centralTx = tx
         centralRx = rx
 
-        ConnectionService.addGattListener(this)
+        ConnectionService.addGattListener("filetransfer",this)
     }
 
     fun enableNotify(gatt: BluetoothGatt) {
@@ -89,8 +89,8 @@ class LowEffortService(
         return status
     }
 
-    fun addOnPacketReceivedListener(listener: OnPacketReceivedListener) {
-        listeners.add(listener)
+    fun setOnPacketReceivedListener(packetListener: OnPacketReceivedListener) {
+        listener = packetListener
     }
 
     // GattListener methods
@@ -99,6 +99,6 @@ class LowEffortService(
     }
 
     override fun onCharacteristicChanged(characteristic: BluetoothGattCharacteristic) {
-        listeners.map { it.onPacketReceived(Packet.fromBytes(characteristic.value)) }
+        listener?.onPacketReceived(Packet.fromBytes(characteristic.value))
     }
 }
\ No newline at end of file
-- 
GitLab