Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions app/src/main/java/net/duhowpi/ftmsbridge/AppSettings.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package net.duhowpi.ftmsbridge

import android.content.Context
import android.content.SharedPreferences

class AppSettings(context: Context) {
private val prefs: SharedPreferences =
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)

var autoconnectMinRssi: Int
get() = prefs.getInt(KEY_AUTOCONNECT_MIN_RSSI, DEFAULT_AUTOCONNECT_MIN_RSSI)
set(value) { prefs.edit().putInt(KEY_AUTOCONNECT_MIN_RSSI, value).apply() }

companion object {
private const val PREFS_NAME = "app_settings"
private const val KEY_AUTOCONNECT_MIN_RSSI = "autoconnect_min_rssi"
const val DEFAULT_AUTOCONNECT_MIN_RSSI = -40
}
}
45 changes: 45 additions & 0 deletions app/src/main/java/net/duhowpi/ftmsbridge/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.SeekBar
import android.widget.ScrollView
import android.widget.TextView
Expand Down Expand Up @@ -65,6 +66,7 @@ class MainActivity : AppCompatActivity() {
private lateinit var hrDebugLogger: BtDebugLogger
private lateinit var db: AppDatabase
private lateinit var scanAdapter: ScanResultAdapter
private lateinit var appSettings: AppSettings

private var ftmsConnectionManager: BleConnectionManager? = null
private var hrConnectionManager: BleConnectionManager? = null
Expand Down Expand Up @@ -228,6 +230,7 @@ class MainActivity : AppCompatActivity() {
hrDebugLogger = BtDebugLogger(BuildConfig.DEBUG, this)
bleScanner = BleScanner(this)
stateMachine = SessionStateMachine(binding, this)
appSettings = AppSettings(this)

createDebugSampleDataIfNeeded()

Expand All @@ -249,6 +252,7 @@ class MainActivity : AppCompatActivity() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.action_history -> { startActivity(Intent(this, WorkoutHistoryActivity::class.java)); true }
R.id.action_settings -> { showSettingsDialog(); true }
R.id.action_debug -> { showDebugDialog(); true }
R.id.action_about -> { showAboutDialog(); true }
else -> super.onOptionsItemSelected(item)
Expand All @@ -263,6 +267,31 @@ class MainActivity : AppCompatActivity() {
.show()
}

private fun showSettingsDialog() {
val input = EditText(this).apply {
inputType = android.text.InputType.TYPE_CLASS_NUMBER or
android.text.InputType.TYPE_NUMBER_FLAG_SIGNED
setText(appSettings.autoconnectMinRssi.toString())
hint = AppSettings.DEFAULT_AUTOCONNECT_MIN_RSSI.toString()
}
AlertDialog.Builder(this)
.setTitle(getString(R.string.settings))
.setMessage(getString(R.string.settings_autoconnect_min_rssi))
.setView(input)
.setPositiveButton(android.R.string.ok) { _, _ ->
val text = input.text.toString()
val value = text.toIntOrNull()
if (value == null || value >= 0) {
Toast.makeText(this, getString(R.string.settings_invalid_rssi), Toast.LENGTH_LONG).show()
} else {
appSettings.autoconnectMinRssi = value
}
}
.setNegativeButton(android.R.string.cancel, null)
.show()
}


private fun setupScanList() {
scanAdapter = ScanResultAdapter(
onConnect = { info -> onDeviceConnectTapped(info) },
Expand Down Expand Up @@ -549,6 +578,22 @@ class MainActivity : AppCompatActivity() {
)
debugLogger.logMessage("Discovered: $name (${device.address}) FTMS=$isFtms HR=$isHr RSSI=${result.rssi}")
}

// Auto-connect: if this is an FTMS device with strong enough signal and
// no FTMS device is already connected or connecting.
if (isFtms && result.rssi >= appSettings.autoconnectMinRssi) {
runOnUiThread {
if (ftmsConnectionManager?.isConnected != true
&& stateMachine.state is SessionState.Idle
&& dummyTreadmill == null && dummyBike == null
) {
val info = scanResultsMap[device.address] ?: return@runOnUiThread
knownDevicesMap[device.address] = info
debugLogger.logMessage("Auto-connecting to $name (${device.address}) RSSI=${result.rssi}")
connectFtmsDevice(device)
}
}
}
}

override fun onScanFailed(errorCode: Int) {
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/menu/menu_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
android:title="@string/history"
app:showAsAction="always" />

<item
android:id="@+id/action_settings"
android:title="@string/settings"
app:showAsAction="never" />

<item
android:id="@+id/action_debug"
android:title="@string/debug_info"
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values-ca/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,9 @@
<!-- Recording notification -->
<string name="recording_notification_channel">Enregistrament d\'entrenament</string>
<string name="recording_notification_text">Enregistrament d\'entrenament en curs</string>

<!-- Settings -->
<string name="settings">Ajustos</string>
<string name="settings_autoconnect_min_rssi">RSSI mín. de connexió automàtica (dBm)</string>
<string name="settings_invalid_rssi">Valor de RSSI no vàlid. Introdueix un nombre negatiu (p. ex. -40).</string>
</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values-es/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,9 @@
<!-- Recording notification -->
<string name="recording_notification_channel">Grabación de entrenamiento</string>
<string name="recording_notification_text">Grabación de entrenamiento en curso</string>

<!-- Settings -->
<string name="settings">Ajustes</string>
<string name="settings_autoconnect_min_rssi">RSSI mín. de conexión automática (dBm)</string>
<string name="settings_invalid_rssi">Valor de RSSI no válido. Introduce un número negativo (p. ej. -40).</string>
</resources>
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@
<string name="recent_bt_events">Recent BT Events</string>
<string name="log_files">Log Files</string>

<!-- Settings -->
<string name="settings">Settings</string>
<string name="settings_autoconnect_min_rssi">Auto-connect min. RSSI (dBm)</string>
<string name="settings_invalid_rssi">Invalid RSSI value. Enter a negative number (e.g. -40).</string>

<!-- About -->
<string name="about">About</string>
<string name="about_title">About FTMS Bridge</string>
Expand Down
2 changes: 2 additions & 0 deletions fastlane/metadata/android/en-US/changelogs/5.txt
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
- Fixed BLE disconnection when the app is in the background during long workouts
- Added auto-connect to FTMS devices: the app automatically connects to the nearest FTMS machine when its signal strength meets the configured minimum RSSI threshold.
- Added Settings option in the menu to configure the auto-connect minimum RSSI (default: -40 dBm).