Commit 7c13b0fb authored by Stefan Zabka's avatar Stefan Zabka
Browse files

merged master and made navigation compatible

parents 665d4fd4 aec0ac31
Pipeline #2865 passed with stage
in 4 minutes and 15 seconds
......@@ -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) }
}
}
......
......@@ -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
......@@ -22,7 +22,6 @@
package de.ccc.events.badge.card10.filetransfer
import android.bluetooth.BluetoothGatt
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
......@@ -56,8 +55,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
progress.max = 5
button_cancel.setOnClickListener {
//isCancelled = true
startTransfer()
isCancelled = true
}
button_done.setOnClickListener {
......@@ -69,6 +67,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
private fun initConnection() {
val ctx = context ?: throw IllegalStateException()
ConnectionService.addGattListener("batchfiletransfer", this)
ConnectionService.connect(ctx)
}
......@@ -82,6 +81,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
}
private fun transferNext() {
Thread.sleep(1000)
val item = queue.dequeue()
if (item == null || isCancelled) {
......@@ -106,16 +106,15 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
val reader = ChunkedReader(ctx, transferJob.sourceUri, ConnectionService.mtu)
val service = ConnectionService.leService ?: throw IllegalStateException()
transfer = FileTransfer(service, reader, this, transferJob.destPath)
transfer?.start()
} catch (e: Exception) {
Log.e(TAG, "Failed to initialize transfer")
return
}
}
override fun onConnectionStateChange(state: Int) {
if (state == BluetoothGatt.STATE_CONNECTED) {
startTransfer()
}
override fun onConnectionReady() {
startTransfer()
}
override fun onError() {
......
......@@ -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() {
......
......@@ -22,7 +22,6 @@
package de.ccc.events.badge.card10.filetransfer
import android.bluetooth.BluetoothAdapter
import android.content.Intent
import android.os.Bundle
import android.util.Log
......@@ -33,14 +32,13 @@ import android.widget.Button
import android.widget.EditText
import android.widget.ProgressBar
import android.widget.TextView
import androidx.annotation.UiThread
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import de.ccc.events.badge.card10.CARD10_BLUETOOTH_MAC_PREFIX
import androidx.navigation.fragment.findNavController
import de.ccc.events.badge.card10.R
import de.ccc.events.badge.card10.common.ConnectionException
import de.ccc.events.badge.card10.common.ConnectionService
import de.ccc.events.badge.card10.common.GattListener
import java.lang.Exception
import java.lang.IllegalStateException
private const val TAG = "FileTransferFragment"
private const val INTENT_RESULT_CODE_FILE = 1
......@@ -76,8 +74,15 @@ class FileTransferFragment : Fragment(), GattListener, FileTransferListener{
buttonStartStop = view.findViewById(R.id.button_start_stop_transfer)
initConnection()
toggleControls()
try {
initConnection()
toggleControls()
} catch (e: ConnectionException) {
showError(e.message)
} catch (e: Exception) {
showError(getString(R.string.connection_error_generic))
}
}
private fun initConnection() {
......@@ -160,4 +165,18 @@ class FileTransferFragment : Fragment(), GattListener, FileTransferListener{
}
toggleControls()
}
private fun showError(message: String?) {
val ctx = context ?: throw IllegalStateException()
val controller = findNavController()
val errorDialog =
AlertDialog.Builder(ctx)
.setMessage(message ?: getString(R.string.connection_error_generic))
.setPositiveButton(R.string.dialog_action_ok) {
dialog, _ -> dialog.dismiss()
controller.popBackStack(R.id.mainFragment, false)
}
.show()
}
}
\ No newline at end of file
......@@ -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
......@@ -115,7 +115,7 @@ class AppDetailFragment : Fragment() {
targetFile.createNewFile()
Log.d(TAG, "Extracting ${entry.name} to ${targetFile.absolutePath}")
tarStream.copyTo(targetFile.outputStream())
appFiles.add(TransferJob(targetFile.toUri(), "apps/${entry.name}"))
appFiles.add(TransferJob(targetFile.toUri(), "/apps/${entry.name}"))
}
val launcher = createLauncher(app.slug, cacheDir)
......@@ -148,12 +148,12 @@ class AppDetailFragment : Fragment() {
val src = """
# Launcher script for $slug
import os
os.exec("apps/$slug/__init__.py")
os.exec("/apps/$slug/__init__.py")
""".trimIndent()
file.writeText(src)
return TransferJob(file.toUri(), fileName)
return TransferJob(file.toUri(), "/$fileName")
}
}
}
......@@ -38,8 +38,7 @@
android:text="@string/main_button_browse_apps"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:enabled="false"/>
app:layout_constraintTop_toTopOf="parent"/>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment