Skip to content

Commit

Permalink
bt state broadcast receiver
Browse files Browse the repository at this point in the history
  • Loading branch information
Aleksandr-ru committed Mar 19, 2024
1 parent 10088a4 commit 7fa6b09
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 68 deletions.
161 changes: 96 additions & 65 deletions app/src/main/java/ru/aleksandr/dccppthrottle/ConnectActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ package ru.aleksandr.dccppthrottle

import android.Manifest
import android.annotation.SuppressLint
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
Expand All @@ -38,14 +41,30 @@ class ConnectActivity : AppCompatActivity() {

private val prefKeyLastMac by lazy { getString(R.string.pref_key_last_mac) }
private val prefKeyConnectStartup by lazy { getString(R.string.pref_key_connect_startup) }
private var startup = false

private val bluetoothPermission =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) Manifest.permission.BLUETOOTH_CONNECT
else Manifest.permission.BLUETOOTH

private val bluetoothRequest = 1
private var pairedDevices : Set<BluetoothDevice>? = null
private val btReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
when(intent?.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)) {
BluetoothAdapter.STATE_ON -> setupDevicesList()
BluetoothAdapter.STATE_OFF -> setupDevicesList()
else -> { /* do nothing */ }
}
}
}
}

private fun haveBluetoothPermission() =
checkSelfPermission(bluetoothPermission) == PackageManager.PERMISSION_GRANTED

@SuppressLint("MissingPermission")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_connect)
Expand Down Expand Up @@ -109,9 +128,45 @@ class ConnectActivity : AppCompatActivity() {
connection.connect(device.address)
}

if (checkSelfPermission(bluetoothPermission) == PackageManager.PERMISSION_GRANTED) {
// setupDevicesList()
// moved to onStart to get changes in devices
val filter = IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)
registerReceiver(btReceiver, filter)

if (BuildConfig.DEBUG) {
Snackbar.make(layout, "Debug mode enabled", Snackbar.LENGTH_INDEFINITE)
.setAction("Debug") {
val myIntent = Intent(this, MainActivity::class.java)
startActivity(myIntent)
}.show()
}

startup = true // perform connect at startup check
}

override fun onStart() {
super.onStart()

if (CommandStation.isConnected()) {
CommandStation.disconnect()
if (BuildConfig.DEBUG) Log.i(TAG, "Command station disconnected")
}

if (haveBluetoothPermission()) {
setupDevicesList()
if (startup) {
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val lastMac = prefs.getString(prefKeyLastMac, null)
val connectAtStart = prefs.getBoolean(prefKeyConnectStartup, false)
Handler(Looper.getMainLooper()).post {
pairedDevices?.let {
val btn = findViewById<Button>(R.id.btnConnect)
val chk = findViewById<CheckBox>(R.id.checkConnectAtStart)
if (connectAtStart && it.isNotEmpty() && it.elementAt(0).address == lastMac) {
chk.isChecked = true
btn.performClick()
}
}
}
}
}
else if (shouldShowRequestPermissionRationale(bluetoothPermission)) {
AlertDialog.Builder(this)
Expand All @@ -127,77 +182,53 @@ class ConnectActivity : AppCompatActivity() {
requestPermissions(arrayOf(bluetoothPermission), bluetoothRequest)
}

val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val lastMac = prefs.getString(prefKeyLastMac, null)
val connectAtStart = prefs.getBoolean(prefKeyConnectStartup, false)
Handler(Looper.getMainLooper()).post {
pairedDevices?.let {
if (connectAtStart && it.isNotEmpty() && it.elementAt(0).address == lastMac) {
chk.isChecked = true
btn.performClick()
}
}
}

if (BuildConfig.DEBUG) {
Snackbar.make(layout, "Debug mode enabled", Snackbar.LENGTH_INDEFINITE)
.setAction("Debug") {
val myIntent = Intent(this, MainActivity::class.java)
startActivity(myIntent)
}.show()
}
startup = false
}

override fun onStart() {
super.onStart()

if (checkSelfPermission(bluetoothPermission) == PackageManager.PERMISSION_GRANTED) {
setupDevicesList()
}
override fun onDestroy() {
super.onDestroy()

if (CommandStation.isConnected()) {
CommandStation.disconnect()
if (BuildConfig.DEBUG) Log.i(TAG, "Command station disconnected")
}
unregisterReceiver(btReceiver)
}

@SuppressLint("MissingPermission")
private fun setupDevicesList() {
val btManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
val btAdapter = btManager.adapter
if (btAdapter == null) {
val message = "Bluetooth not supported" // emulator?
Log.e(TAG, message)
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
return
}
if (!btAdapter.isEnabled) {
Toast.makeText(this, R.string.message_bluetooth_disabled, Toast.LENGTH_SHORT).show()
}
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val lastMac = prefs.getString(prefKeyLastMac, null)
pairedDevices = btAdapter.bondedDevices.sortedBy { it.address != lastMac }.toSet()
if (haveBluetoothPermission()) {
val btManager = getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
val btAdapter = btManager.adapter
if (btAdapter == null) {
val message = "Bluetooth not supported" // emulator?
Log.e(TAG, message)
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
return
}
if (!btAdapter.isEnabled) {
Toast.makeText(this, R.string.message_bluetooth_disabled, Toast.LENGTH_SHORT).show()
}
val prefs = PreferenceManager.getDefaultSharedPreferences(this)
val lastMac = prefs.getString(prefKeyLastMac, null)
pairedDevices = btAdapter.bondedDevices.sortedBy { it.address != lastMac }.toSet()

val btn = findViewById<Button>(R.id.btnConnect)
val spinner: Spinner = findViewById(R.id.spinnerBtList)
var devicesList = listOf(getString(R.string.label_bluetooth_empty))
if (pairedDevices.isNullOrEmpty()) {
// Disable or enable it before setting the adapter.
spinner.isEnabled = false
btn.isEnabled = false
}
else {
btn.isEnabled = true
spinner.isEnabled = true
devicesList = pairedDevices!!.map { it.name }
}
val btn = findViewById<Button>(R.id.btnConnect)
val spinner: Spinner = findViewById(R.id.spinnerBtList)
var devicesList = listOf(getString(R.string.label_bluetooth_empty))
if (pairedDevices.isNullOrEmpty()) {
// Disable or enable it before setting the adapter.
spinner.isEnabled = false
btn.isEnabled = false
} else {
btn.isEnabled = true
spinner.isEnabled = true
devicesList = pairedDevices!!.map { it.name }
}

val adapter: ArrayAdapter<String> = ArrayAdapter(
this,
android.R.layout.simple_spinner_dropdown_item,
devicesList
)
spinner.adapter = adapter
val adapter: ArrayAdapter<String> = ArrayAdapter(
this,
android.R.layout.simple_spinner_dropdown_item,
devicesList
)
spinner.adapter = adapter
}
}

override fun onRequestPermissionsResult(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ object CommandStation {
sendCommand(command)
}

fun getTrackCurrent() {
val command = CurrentCommand()
sendCommand(command)
}

fun setTrackPower(isOn: Boolean) {
val power = if (isOn) 1 else 0
val command = PowerCommand(power)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class LocoCabFragment : Fragment() {
val selfResetTime = loco.funcReset[i]
if (isChecked && selfResetTime > 0) Handler(Looper.getMainLooper()).postDelayed({
CommandStation.setLocomotiveFunction(slot, i, false)
if (BuildConfig.DEBUG) button.isChecked = false
if (BuildConfig.DEBUG && !CommandStation.isConnected()) button.isChecked = false
}, selfResetTime.toLong())
}
}
Expand Down
4 changes: 2 additions & 2 deletions app/version.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#Mon Mar 18 11:51:22 MSK 2024
VERSION_CODE=1058
#Tue Mar 19 12:57:20 MSK 2024
VERSION_CODE=1071

0 comments on commit 7fa6b09

Please sign in to comment.