Commit a9a9d954 authored by Anon's avatar Anon
Browse files

Add dedicated send activity

parent a68b812c
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
</activity> </activity>
<activity android:name=".ScanActivity" /> <activity android:name=".ScanActivity" />
<activity android:name=".SendActivity" />
</application> </application>
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.BLUETOOTH"/>
......
package com.github.antweb.donkey package com.github.antweb.donkey
import android.bluetooth.*
import android.content.Context
import android.content.Intent import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.util.Log
import android.widget.Button import android.widget.Button
import android.widget.TextView import android.widget.TextView
import java.lang.NullPointerException import androidx.appcompat.app.AppCompatActivity
private const val TAG = "MainActivity" private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity() {
private val targetDeviceName = "card10"
private val mtu = 128
private val serviceUuid = "00422342-2342-2342-2342-234223422342"
private val dataCharacteristicUuid = "01422342-2342-2342-2342-234223422342"
private val bluetoothAdapter: BluetoothAdapter? by lazy(LazyThreadSafetyMode.NONE) {
val bluetoothManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
bluetoothManager.adapter
}
private var bluetoothGatt: BluetoothGatt? = null
private var fileService: BluetoothGattService? = null
private var dataCharacteristic: BluetoothGattCharacteristic? = null
private var mGatt: BluetoothGatt? = null
private var fileTransferService: FileTransfer? = null
private var mScanning: Boolean = false
private var connected = false
private lateinit var tvConnection: TextView private lateinit var tvConnection: TextView
private lateinit var tvValue: TextView private lateinit var tvValue: TextView
private lateinit var buttonConnect: Button private lateinit var buttonConnect: Button
...@@ -48,109 +24,8 @@ class MainActivity : AppCompatActivity() { ...@@ -48,109 +24,8 @@ class MainActivity : AppCompatActivity() {
buttonConnect = findViewById(R.id.button_connect) buttonConnect = findViewById(R.id.button_connect)
buttonConnect.setOnClickListener { buttonConnect.setOnClickListener {
// scanLeDevice()
val intent = Intent(this, ScanActivity::class.java) val intent = Intent(this, ScanActivity::class.java)
startActivity(intent) startActivity(intent)
} }
} }
private fun scanLeDevice() {
val gattCallback = object : BluetoothGattCallback() {
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
super.onServicesDiscovered(gatt, status)
if (gatt == null) {
throw NullPointerException()
}
for (service in gatt.services) {
Log.d(TAG, "Found service: ${service.uuid}")
if (service.uuid.toString() == serviceUuid) {
fileService = service
}
for (characteristic in service.characteristics) {
Log.d(TAG, "Characteristic: ${characteristic.uuid}")
if (characteristic.uuid.toString() == dataCharacteristicUuid) {
dataCharacteristic = characteristic
}
}
}
if (fileService == null || dataCharacteristic == null) {
Log.e(TAG, "Could not find file transfer service")
return
}
gatt.requestMtu(mtu)
}
override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
super.onConnectionStateChange(gatt, status, newState)
when (newState) {
BluetoothGatt.STATE_CONNECTED -> {
runOnUiThread {
tvConnection.text = "STATE_CONNECTED"
}
mGatt = gatt
gatt?.discoverServices()
}
BluetoothGatt.STATE_DISCONNECTED -> tvConnection.text = "STATE_DISCONNECTED"
BluetoothGatt.STATE_CONNECTING -> tvConnection.text = "STATE_CONNECTING"
BluetoothGatt.STATE_DISCONNECTING -> tvConnection.text = "STATE_DISCONNECTING"
}
}
override fun onMtuChanged(gatt: BluetoothGatt?, mtu: Int, status: Int) {
Log.d(TAG, "MTU changed to: $mtu")
runOnUiThread {
tvValue.text = "MTU: $mtu"
}
val lData = dataCharacteristic
if (gatt != null && lData != null) {
fileTransferService = FileTransfer(gatt, lData, mtu)
fileTransferService?.sendFile()
}
}
override fun onReliableWriteCompleted(gatt: BluetoothGatt?, status: Int) {
// Last chunk sent successfully. Send next chunk
fileTransferService?.sendNext()
}
override fun onCharacteristicWrite(
gatt: BluetoothGatt?,
characteristic: BluetoothGattCharacteristic?,
status: Int
) {
gatt?.executeReliableWrite()
}
}
val leScanCallback = BluetoothAdapter.LeScanCallback { device, _, _ ->
if (device.name == targetDeviceName) {
if (!connected) {
connected = true
bluetoothGatt = device.connectGatt(this, true, gattCallback, BluetoothDevice.TRANSPORT_LE)
}
}
}
// Stops scanning after a pre-defined period
Handler().postDelayed({
mScanning = false
bluetoothAdapter?.stopLeScan(leScanCallback)
}, 5000)
mScanning = true
bluetoothAdapter?.startLeScan(leScanCallback)
}
} }
...@@ -14,6 +14,11 @@ private const val TAG = "ScanActivity" ...@@ -14,6 +14,11 @@ private const val TAG = "ScanActivity"
class ScanActivity : AppCompatActivity() { class ScanActivity : AppCompatActivity() {
// TODO: Figure out how to transfer this later
companion object {
var selectedDevice: BluetoothDevice? = null
}
private lateinit var listView: ListView private lateinit var listView: ListView
private lateinit var listAdapter: DeviceListAdapter private lateinit var listAdapter: DeviceListAdapter
...@@ -32,6 +37,16 @@ class ScanActivity : AppCompatActivity() { ...@@ -32,6 +37,16 @@ class ScanActivity : AppCompatActivity() {
listAdapter = DeviceListAdapter(applicationContext) listAdapter = DeviceListAdapter(applicationContext)
listView.adapter = listAdapter listView.adapter = listAdapter
listView.setOnItemClickListener { adapterView, view, i, l ->
val item = adapterView.adapter.getItem(i) as? BluetoothDevice
if (item != null) {
selectedDevice = item
val intent = Intent(this, SendActivity::class.java)
startActivity(intent)
}
}
checkPermissions() checkPermissions()
scan() scan()
} }
...@@ -47,13 +62,6 @@ class ScanActivity : AppCompatActivity() { ...@@ -47,13 +62,6 @@ class ScanActivity : AppCompatActivity() {
val foundDevices = mutableSetOf<BluetoothDevice>() val foundDevices = mutableSetOf<BluetoothDevice>()
val leScanCallback = BluetoothAdapter.LeScanCallback { device, _, _ -> val leScanCallback = BluetoothAdapter.LeScanCallback { device, _, _ ->
// if (device.name == targetDeviceName) {
// if (!connected) {
// connected = true
// bluetoothGatt = device.connectGatt(this, true, gattCallback, BluetoothDevice.TRANSPORT_LE)
// }
// }
if (!foundDevices.contains(device)) { if (!foundDevices.contains(device)) {
foundDevices.add(device) foundDevices.add(device)
listAdapter.add(device) listAdapter.add(device)
......
package com.github.antweb.donkey
import android.bluetooth.*
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.github.antweb.donkey.file.FileTransfer
import java.lang.NullPointerException
import java.util.*
private const val TAG = "SendActivity"
class SendActivity : AppCompatActivity() {
private val mtu = 128
private val serviceUuid = "00422342-2342-2342-2342-234223422342"
private val centralTxCharacteristicUuid = UUID.fromString("01422342-2342-2342-2342-234223422342")
private val centralRxCharacteristicUuid = UUID.fromString("02422342-2342-2342-2342-234223422342")
private var bluetoothGatt: BluetoothGatt? = null
private var fileService: BluetoothGattService? = null
private var mGatt: BluetoothGatt? = null
private var fileTransferService: FileTransfer? = null
private lateinit var tvConnection: TextView
private lateinit var tvValue: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_send)
tvValue = findViewById(R.id.text_value)
tvConnection = findViewById(R.id.text_connection_status)
tvConnection.text = "STATE_DISCONNECTED"
val device = ScanActivity.selectedDevice
if (device != null) {
connect(device)
} else {
Log.e(TAG, "Device is NULL!")
}
}
fun connect(device: BluetoothDevice) {
val gattCallback = object : BluetoothGattCallback() {
override fun onServicesDiscovered(gatt: BluetoothGatt?, status: Int) {
if (gatt == null) {
throw NullPointerException()
}
for (service in gatt.services) {
Log.d(TAG, "Found service: ${service.uuid}")
if (service.uuid.toString() == serviceUuid) {
fileService = service
}
}
if (fileService == null) {
Log.e(TAG, "Could not find file transfer service")
return
}
gatt.requestMtu(mtu)
}
override fun onConnectionStateChange(gatt: BluetoothGatt?, status: Int, newState: Int) {
when (newState) {
BluetoothGatt.STATE_CONNECTED -> {
runOnUiThread {
tvConnection.text = "STATE_CONNECTED"
}
mGatt = gatt
gatt?.discoverServices()
}
BluetoothGatt.STATE_DISCONNECTED -> tvConnection.text = "STATE_DISCONNECTED"
BluetoothGatt.STATE_CONNECTING -> tvConnection.text = "STATE_CONNECTING"
BluetoothGatt.STATE_DISCONNECTING -> tvConnection.text = "STATE_DISCONNECTING"
}
}
override fun onCharacteristicChanged(gatt: BluetoothGatt?, characteristic: BluetoothGattCharacteristic?) {
super.onCharacteristicChanged(gatt, characteristic)
}
override fun onCharacteristicRead(
gatt: BluetoothGatt?,
characteristic: BluetoothGattCharacteristic?,
status: Int
) {
super.onCharacteristicRead(gatt, characteristic, status)
}
override fun onMtuChanged(gatt: BluetoothGatt?, mtu: Int, status: Int) {
Log.d(TAG, "MTU changed to: $mtu")
runOnUiThread {
tvValue.text = "MTU: $mtu"
}
val tx = fileService?.getCharacteristic(centralTxCharacteristicUuid)
val rx = fileService?.getCharacteristic(centralRxCharacteristicUuid)
if (gatt != null && tx != null && rx != null) {
val notifySuccess = gatt.setCharacteristicNotification(rx, true)
if (!notifySuccess) {
Log.e(TAG, "Notify enable failed")
}
// fileTransferService = FileTransfer("/Download/SEND.txt", mtu)
// fileTransferService?.sendFile()
}
}
override fun onCharacteristicWrite(
gatt: BluetoothGatt?,
characteristic: BluetoothGattCharacteristic?,
status: Int
) {
// Thread.sleep(3000)
// fileTransferService?.sendNext()
// return
}
}
bluetoothGatt = device.connectGatt(this, true, gattCallback, BluetoothDevice.TRANSPORT_LE)
}
}
\ No newline at end of file
...@@ -4,4 +4,14 @@ ...@@ -4,4 +4,14 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_connection_status"
/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/text_value"
/>
</LinearLayout> </LinearLayout>
\ No newline at end of file
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