From f7215a135198cf4d2927bdd74eea428b6d7a7469 Mon Sep 17 00:00:00 2001 From: Anton Weber <anton@antweb.me> Date: Thu, 22 Aug 2019 16:53:09 +0200 Subject: [PATCH] Share common connection. --- .../filetransfer/BatchTransferFragment.kt | 13 +--- .../filetransfer/FileTransferFragment.kt | 7 -- .../events/badge/card10/mood/MoodFragment.kt | 77 ++++--------------- .../badge/card10/sparkle/BeautifulFragment.kt | 58 ++------------ .../events/badge/card10/time/Card10Service.kt | 19 ++++- 5 files changed, 38 insertions(+), 136 deletions(-) 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 30aa751..801b7ca 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 @@ -57,7 +57,6 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener { inflater.inflate(R.layout.batch_transfer_fragment, container, false) override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - label_status.text = getString(R.string.batch_transfer_label_initializing) progress.max = queue.size button_cancel.setOnClickListener { @@ -72,13 +71,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener { .commit() } - initConnection() - } - - private fun initConnection() { - val ctx = context ?: throw IllegalStateException() - ConnectionService.addGattListener("batchfiletransfer", this) - ConnectionService.connect(ctx) + startTransfer() } private fun startTransfer() { @@ -123,10 +116,6 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener { } } - override fun onConnectionReady() { - startTransfer() - } - override fun onError() { activity?.runOnUiThread { label_status.text = getString(R.string.batch_transfer_label_error) diff --git a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransferFragment.kt b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransferFragment.kt index 0730711..8a19627 100644 --- a/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransferFragment.kt +++ b/app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransferFragment.kt @@ -80,19 +80,12 @@ class FileTransferFragment : Fragment(), GattListener, FileTransferListener{ buttonStartStop = view.findViewById(R.id.button_start_stop_transfer) try { - initConnection() toggleControls() } catch (e: ConnectionException) { showError(e.message) } catch (e: Exception) { showError(getString(R.string.connection_error_generic)) } - - } - - private fun initConnection() { - val ctx = context ?: throw IllegalStateException() - ConnectionService.connect(ctx) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/de/ccc/events/badge/card10/mood/MoodFragment.kt b/app/src/main/java/de/ccc/events/badge/card10/mood/MoodFragment.kt index 7ff715c..f9224c5 100644 --- a/app/src/main/java/de/ccc/events/badge/card10/mood/MoodFragment.kt +++ b/app/src/main/java/de/ccc/events/badge/card10/mood/MoodFragment.kt @@ -22,60 +22,23 @@ package de.ccc.events.badge.card10.mood -import android.bluetooth.BluetoothAdapter -import android.bluetooth.BluetoothGatt -import android.bluetooth.BluetoothGattCallback -import android.bluetooth.BluetoothGattCharacteristic import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import de.ccc.events.badge.card10.CARD10_BLUETOOTH_MAC_PREFIX -import de.ccc.events.badge.card10.CARD10_SERVICE_UUID import de.ccc.events.badge.card10.R -import de.ccc.events.badge.card10.ROCKETS_CHARACTERISTIC_UUID +import de.ccc.events.badge.card10.common.ConnectionService +import de.ccc.events.badge.card10.time.Card10Service import kotlinx.android.synthetic.main.mood_fragment.* -import java.util.concurrent.CountDownLatch class MoodFragment : Fragment() { - - private val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() - private lateinit var gatt: BluetoothGatt - private var rocketsCharacteristic: BluetoothGattCharacteristic? = null - private var writeLatch: CountDownLatch? = null + private var card10Service: Card10Service? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val callback = object : BluetoothGattCallback() { - override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { - System.out.println("===== onConnectionStateChange " + gatt + " / " + status + " / " + newState) - if (newState == BluetoothGatt.STATE_CONNECTED) - gatt.discoverServices() - } - - override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) { - System.out.println("===== onServicesDiscovered " + gatt + " / " + status) - val card10Service = gatt.getService(CARD10_SERVICE_UUID) - rocketsCharacteristic = card10Service.getCharacteristic(ROCKETS_CHARACTERISTIC_UUID) - } - - override fun onCharacteristicWrite( - gatt: BluetoothGatt, - characteristic: BluetoothGattCharacteristic, - status: Int - ) { - System.out.println("===== onCharacteristicWrite " + characteristic.uuid.toString() + " / " + characteristic.value + " / " + status) - writeLatch?.countDown(); - } - } - - val remoteDevices = - bluetoothAdapter.bondedDevices.filter { it.address.startsWith(CARD10_BLUETOOTH_MAC_PREFIX, true) } - if (remoteDevices.isEmpty()) - activity!!.finish() - gatt = remoteDevices.get(0).connectGatt(activity, false, callback) + card10Service = ConnectionService.card10Service } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -83,28 +46,14 @@ class MoodFragment : Fragment() { } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - mood_good.setOnClickListener({ - writeGatt(rocketsCharacteristic!!, ubyteArrayOf(0xffu, 0x00u, 0x00u).toByteArray()) - }) - mood_neutral.setOnClickListener({ - writeGatt(rocketsCharacteristic!!, ubyteArrayOf(0x00u, 0xffu, 0x00u).toByteArray()) - }) - mood_bad.setOnClickListener({ - writeGatt(rocketsCharacteristic!!, ubyteArrayOf(0x00u, 0x00u, 0xffu).toByteArray()) - }) - } - - fun writeGatt(characteristic: BluetoothGattCharacteristic, values: ByteArray) { - characteristic.value = values - val init = gatt.writeCharacteristic(rocketsCharacteristic) - if (!init) - System.out.println("Failed to initiate writing GATT attribute") - writeLatch = CountDownLatch(1) - writeLatch!!.await(); - } - - override fun onDestroy() { - gatt.close(); - super.onDestroy() + mood_good.setOnClickListener{ + card10Service?.setRocketValue(ubyteArrayOf(0xffu, 0x00u, 0x00u).toByteArray()) + } + mood_neutral.setOnClickListener{ + card10Service?.setRocketValue(ubyteArrayOf(0x00u, 0xffu, 0x00u).toByteArray()) + } + mood_bad.setOnClickListener{ + card10Service?.setRocketValue(ubyteArrayOf(0x00u, 0x00u, 0xffu).toByteArray()) + } } } diff --git a/app/src/main/java/de/ccc/events/badge/card10/sparkle/BeautifulFragment.kt b/app/src/main/java/de/ccc/events/badge/card10/sparkle/BeautifulFragment.kt index fbf7fc4..240f65d 100644 --- a/app/src/main/java/de/ccc/events/badge/card10/sparkle/BeautifulFragment.kt +++ b/app/src/main/java/de/ccc/events/badge/card10/sparkle/BeautifulFragment.kt @@ -22,65 +22,27 @@ package de.ccc.events.badge.card10.sparkle -import android.bluetooth.* import android.os.Bundle import android.os.Handler import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import de.ccc.events.badge.card10.CARD10_BLUETOOTH_MAC_PREFIX -import de.ccc.events.badge.card10.CARD10_SERVICE_UUID -import de.ccc.events.badge.card10.LEDS_ABOVE_CHARACTERISTIC_UUID import de.ccc.events.badge.card10.R -import java.util.concurrent.CountDownLatch +import de.ccc.events.badge.card10.common.ConnectionService +import de.ccc.events.badge.card10.time.Card10Service import kotlin.random.Random class BeautifulFragment : Fragment(), Runnable { - - private val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter() - private lateinit var gatt: BluetoothGatt - private var ledsAboveCharacteristic: BluetoothGattCharacteristic? = null - private @Volatile var writeLatch: CountDownLatch? = null private val handler = Handler() + private var card10Service: Card10Service? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val callback = object : BluetoothGattCallback() { - override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { - println("===== onConnectionStateChange ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status} ${if (newState == BluetoothProfile.STATE_CONNECTED) "CONNECTED" else if (newState == BluetoothProfile.STATE_DISCONNECTED) "DISCONNECTED" else newState}") - if (newState == BluetoothGatt.STATE_CONNECTED) - gatt.requestMtu(64) - } - - override fun onMtuChanged(gatt: BluetoothGatt, mtu: Int, status: Int) { - println("===== onMtuChanged ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status} ${mtu}") - gatt.discoverServices() - } - - override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) { - println("===== onServicesDiscovered ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status}") - val card10Service = gatt.getService(CARD10_SERVICE_UUID) - ledsAboveCharacteristic = card10Service.getCharacteristic(LEDS_ABOVE_CHARACTERISTIC_UUID) - handler.post(this@BeautifulFragment) - } - - override fun onCharacteristicWrite( - gatt: BluetoothGatt, - characteristic: BluetoothGattCharacteristic, - status: Int - ) { - println("=== onCharacteristicWrite ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status} ${characteristic.uuid} ${characteristic.value}") - writeLatch?.countDown(); - } - } - - val remoteDevices = - bluetoothAdapter.bondedDevices.filter { it.address.startsWith(CARD10_BLUETOOTH_MAC_PREFIX, true) } - if (remoteDevices.isEmpty()) - activity!!.finish() - gatt = remoteDevices.get(0).connectGatt(activity, false, callback) + card10Service = ConnectionService.card10Service + handler.post(this@BeautifulFragment) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -88,18 +50,12 @@ class BeautifulFragment : Fragment(), Runnable { } override fun run() { - ledsAboveCharacteristic!!.value = Random.nextBytes(33); - writeLatch = CountDownLatch(1) - val init = gatt.writeCharacteristic(ledsAboveCharacteristic) - if (!init) - println("=== Failed to initiate writing GATT attribute") - writeLatch!!.await(); + card10Service?.setLeds(Random.nextBytes(33)) handler.postDelayed(this, 100) } override fun onDestroy() { handler.removeCallbacksAndMessages(null) - gatt.close(); super.onDestroy() } } diff --git a/app/src/main/java/de/ccc/events/badge/card10/time/Card10Service.kt b/app/src/main/java/de/ccc/events/badge/card10/time/Card10Service.kt index ea5aec8..db1501c 100644 --- a/app/src/main/java/de/ccc/events/badge/card10/time/Card10Service.kt +++ b/app/src/main/java/de/ccc/events/badge/card10/time/Card10Service.kt @@ -24,6 +24,8 @@ package de.ccc.events.badge.card10.time import android.bluetooth.BluetoothGattCharacteristic import android.bluetooth.BluetoothGattService +import de.ccc.events.badge.card10.LEDS_ABOVE_CHARACTERISTIC_UUID +import de.ccc.events.badge.card10.ROCKETS_CHARACTERISTIC_UUID import de.ccc.events.badge.card10.TIME_CHARACTERISTIC_UUID import de.ccc.events.badge.card10.common.ConnectionService import java.nio.ByteBuffer @@ -31,11 +33,14 @@ import java.nio.ByteBuffer class Card10Service( service: BluetoothGattService ) { - private val timeCharacteristic: BluetoothGattCharacteristic + private val timeCharacteristic = service.getCharacteristic(TIME_CHARACTERISTIC_UUID) + private val rocketsCharacteristic = service.getCharacteristic(ROCKETS_CHARACTERISTIC_UUID) + private var ledsAboveCharacteristic = service.getCharacteristic(LEDS_ABOVE_CHARACTERISTIC_UUID) init { - timeCharacteristic = service.getCharacteristic(TIME_CHARACTERISTIC_UUID) timeCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE + rocketsCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE + ledsAboveCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE } fun setTime() { @@ -44,4 +49,14 @@ class Card10Service( timeCharacteristic.value = buffer.array() ConnectionService.writeCharacteristic(timeCharacteristic) } + + fun setRocketValue(value: ByteArray) { + rocketsCharacteristic.value = value + ConnectionService.writeCharacteristic(rocketsCharacteristic) + } + + fun setLeds(value: ByteArray) { + ledsAboveCharacteristic.value = value + ConnectionService.writeCharacteristic(ledsAboveCharacteristic) + } } \ No newline at end of file -- GitLab