Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Stefan Zabka
Companion App Android
Commits
7c13b0fb
Commit
7c13b0fb
authored
Aug 22, 2019
by
Stefan Zabka
Browse files
merged master and made navigation compatible
parents
665d4fd4
aec0ac31
Pipeline
#2865
passed with stage
in 4 minutes and 15 seconds
Changes
8
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/de/ccc/events/badge/card10/common/ConnectionService.kt
View file @
7c13b0fb
...
...
@@ -42,7 +42,7 @@ object ConnectionService {
private
var
connection
:
BluetoothGatt
?
=
null
private
var
connectionState
=
BluetoothGatt
.
STATE_DISCONNECTED
private
var
gattListeners
=
mutable
ListOf
<
GattListener
>()
private
var
gattListeners
=
mutable
MapOf
<
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
)
}
}
}
...
...
app/src/main/java/de/ccc/events/badge/card10/common/GattListener.kt
View file @
7c13b0fb
...
...
@@ -27,5 +27,5 @@ import android.bluetooth.BluetoothGattCharacteristic
interface
GattListener
{
fun
onCharacteristicWrite
(
characteristic
:
BluetoothGattCharacteristic
,
status
:
Int
)
{}
fun
onCharacteristicChanged
(
characteristic
:
BluetoothGattCharacteristic
)
{}
fun
onConnection
StateChange
(
state
:
Int
)
{}
fun
onConnection
Ready
(
)
{}
}
\ No newline at end of file
app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
View file @
7c13b0fb
...
...
@@ -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
()
{
...
...
app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransfer.kt
View file @
7c13b0fb
...
...
@@ -41,7 +41,7 @@ class FileTransfer(
private
var
currentState
=
TransferState
.
IDLE
init
{
service
.
add
OnPacketReceivedListener
(
this
)
service
.
set
OnPacketReceivedListener
(
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
()
{
...
...
app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransferFragment.kt
View file @
7c13b0fb
...
...
@@ -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.a
nnotation.UiThread
import
androidx.a
ppcompat.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
app/src/main/java/de/ccc/events/badge/card10/filetransfer/LowEffortService.kt
View file @
7c13b0fb
...
...
@@ -43,7 +43,7 @@ class LowEffortService(
private
val
centralRxCharacteristicUuid
=
UUID
.
fromString
(
"42230102-2342-2342-2342-234223422342"
)
private
var
notifyEnabled
=
false
private
va
l
listener
s
=
mutableListOf
<
OnPacketReceivedListener
>()
private
va
r
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
add
OnPacketReceivedListener
(
l
istener
:
OnPacketReceivedListener
)
{
listener
s
.
add
(
l
istener
)
fun
set
OnPacketReceivedListener
(
packetL
istener
:
OnPacketReceivedListener
)
{
listener
=
packetL
istener
}
// GattListener methods
...
...
@@ -99,6 +99,6 @@ class LowEffortService(
}
override
fun
onCharacteristicChanged
(
characteristic
:
BluetoothGattCharacteristic
)
{
listener
s
.
map
{
it
.
onPacketReceived
(
Packet
.
fromBytes
(
characteristic
.
value
))
}
listener
?
.
onPacketReceived
(
Packet
.
fromBytes
(
characteristic
.
value
))
}
}
\ No newline at end of file
app/src/main/java/de/ccc/events/badge/card10/hatchery/AppDetailFragment.kt
View file @
7c13b0fb
...
...
@@ -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
"
)
}
}
}
app/src/main/res/layout/main_fragment.xml
View file @
7c13b0fb
...
...
@@ -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"
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment