From 0ea40967ac6ab39ad65e9e8da3ae393150be2388 Mon Sep 17 00:00:00 2001 From: Vadim Furman Date: Wed, 3 Feb 2021 20:16:18 -0800 Subject: [PATCH 1/4] testing settings --- .../geeksville/mesh/ui/SettingsFragment.kt | 21 +++++++++++++++++++ app/src/main/res/layout/settings_fragment.xml | 15 +++++++++++++ 2 files changed, 36 insertions(+) diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 78f772151..68f69e03f 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -30,6 +30,7 @@ import com.geeksville.android.Logging import com.geeksville.android.hideKeyboard import com.geeksville.android.isGooglePlayAvailable import com.geeksville.mesh.MainActivity +import com.geeksville.mesh.MeshProtos import com.geeksville.mesh.R import com.geeksville.mesh.android.bluetoothManager import com.geeksville.mesh.android.usbManager @@ -603,6 +604,26 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { requireActivity().hideKeyboard() } + binding.positionBroadcastPeriodEditText.on(EditorInfo.IME_ACTION_DONE) { + val n = binding.positionBroadcastPeriodEditText.text.toString().toIntOrNull() + debug("did IME action, text = ${binding.positionBroadcastPeriodEditText.text.toString()}, int=$n") + val meshService = model.meshService + if (n != null && meshService != null) { + try { + var config: MeshProtos.RadioConfig = + MeshProtos.RadioConfig.parseFrom(meshService.getRadioConfig()) + val builder : MeshProtos.RadioConfig.Builder = config.toBuilder() + builder.preferencesBuilder.setPositionBroadcastSecs(n * 60) + builder.preferencesBuilder.setLsSecs(n * 60) + config = builder.build() + debug("config=${config.toString()}") + meshService.setRadioConfig(config.toByteArray()) + } catch (ex: RemoteException) { + errormsg("Can't change parameter, is device offline? ${ex.message}") + } + } + + } val app = (requireContext().applicationContext as GeeksvilleApplication) // Set analytics checkbox diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml index b15dc757d..9479e2ba8 100644 --- a/app/src/main/res/layout/settings_fragment.xml +++ b/app/src/main/res/layout/settings_fragment.xml @@ -19,6 +19,19 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/deviceRadioGroup" /> + + + + Date: Fri, 5 Feb 2021 21:29:28 -0800 Subject: [PATCH 2/4] Added settings --- app/src/main/AndroidManifest.xml | 2 +- .../java/com/geeksville/mesh/model/UIState.kt | 43 +++++++++++++ .../geeksville/mesh/ui/SettingsFragment.kt | 61 ++++++++++++------- app/src/main/res/layout/settings_fragment.xml | 61 ++++++++++++++----- 4 files changed, 130 insertions(+), 37 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bcdf0ae0b..b71182a06 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -121,7 +121,7 @@ android:name="com.geeksville.mesh.MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" - android:windowSoftInputMode="stateAlwaysHidden" + android:windowSoftInputMode="stateAlwaysHidden|adjustPan" android:theme="@style/AppTheme.NoActionBar"> diff --git a/app/src/main/java/com/geeksville/mesh/model/UIState.kt b/app/src/main/java/com/geeksville/mesh/model/UIState.kt index 40ee1f4ed..37e02dcb2 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -102,6 +102,49 @@ class UIViewModel(app: Application) : AndroidViewModel(app), Logging { val radioConfig = object : MutableLiveData(null) { } + var positionBroadcastSecs: Int? + get() { + radioConfig.value?.preferences?.let { + if (it.locationShare == MeshProtos.LocationSharing.LocDisabled) return 0 + if (it.positionBroadcastSecs > 0) return it.positionBroadcastSecs + // These default values are borrowed from the device code. + if (it.isRouter) return 60 * 60 + return 15 * 60 + } + return null + } + set(value) { + val config = radioConfig.value + if (value != null && config != null) { + val builder = config.toBuilder() + if (value > 0) { + builder.preferencesBuilder.positionBroadcastSecs = value + builder.preferencesBuilder.locationShare = + MeshProtos.LocationSharing.LocEnabled + } else + builder.preferencesBuilder.locationShare = + MeshProtos.LocationSharing.LocDisabled + + setRadioConfig(builder.build()) + } + } + + var lsSleepSecs: Int? + get() { + radioConfig.value?.preferences?.let { + return it.lsSecs + } + return null + } + set(value) { + val config = radioConfig.value + if (value != null && config != null) { + val builder = config.toBuilder() + builder.preferencesBuilder.lsSecs = value + setRadioConfig(builder.build()) + } + } + /// hardware info about our local device val myNodeInfo = object : MutableLiveData(null) {} diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 68f69e03f..ea591e498 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -574,15 +574,30 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { /// Setup the ui widgets unrelated to BLE scanning private fun initCommonUI() { - model.ownerName.observe(viewLifecycleOwner, Observer { name -> + model.ownerName.observe(viewLifecycleOwner, { name -> binding.usernameEditText.setText(name) }) + model.radioConfig.observe(viewLifecycleOwner, { _ -> + var inMinutes = model.positionBroadcastSecs + if (inMinutes != null) { + inMinutes /= 60 + } + binding.positionBroadcastPeriodEditText.setText(inMinutes.toString()) + + binding.lsSleepEditText.setText(model.lsSleepSecs.toString()) + }) + // Only let user edit their name or set software update while connected to a radio - model.isConnected.observe(viewLifecycleOwner, Observer { connected -> - binding.usernameView.isEnabled = connected == MeshService.ConnectionState.CONNECTED - if (connected == MeshService.ConnectionState.DISCONNECTED) + model.isConnected.observe(viewLifecycleOwner, Observer { connectionState -> + val connected = connectionState == MeshService.ConnectionState.CONNECTED + binding.usernameView.isEnabled = connected + binding.positionBroadcastPeriodView.isEnabled = connected + binding.lsSleepView.isEnabled = connected + + if (connectionState == MeshService.ConnectionState.DISCONNECTED) model.ownerName.value = "" + initNodeInfo() }) @@ -600,30 +615,32 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { val n = binding.usernameEditText.text.toString().trim() if (n.isNotEmpty()) model.setOwner(n) - requireActivity().hideKeyboard() } binding.positionBroadcastPeriodEditText.on(EditorInfo.IME_ACTION_DONE) { - val n = binding.positionBroadcastPeriodEditText.text.toString().toIntOrNull() - debug("did IME action, text = ${binding.positionBroadcastPeriodEditText.text.toString()}, int=$n") - val meshService = model.meshService - if (n != null && meshService != null) { - try { - var config: MeshProtos.RadioConfig = - MeshProtos.RadioConfig.parseFrom(meshService.getRadioConfig()) - val builder : MeshProtos.RadioConfig.Builder = config.toBuilder() - builder.preferencesBuilder.setPositionBroadcastSecs(n * 60) - builder.preferencesBuilder.setLsSecs(n * 60) - config = builder.build() - debug("config=${config.toString()}") - meshService.setRadioConfig(config.toByteArray()) - } catch (ex: RemoteException) { - errormsg("Can't change parameter, is device offline? ${ex.message}") - } + val str = binding.positionBroadcastPeriodEditText.text.toString() + var n = str.toIntOrNull() + if (n != null && n < 100000 && n >= 0) { + n *= 60 + model.positionBroadcastSecs = n + } else { + binding.scanStatusText.text = "Bad value: $str" } - + requireActivity().hideKeyboard() } + + binding.lsSleepEditText.on(EditorInfo.IME_ACTION_DONE) { + val str = binding.lsSleepEditText.text.toString() + var n = str.toIntOrNull() + if (n != null && n < 100000 && n >= 0) { + model.lsSleepSecs = n + } else { + binding.scanStatusText.text = "Bad value: $str" + } + requireActivity().hideKeyboard() + } + val app = (requireContext().applicationContext as GeeksvilleApplication) // Set analytics checkbox diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml index 9479e2ba8..8781cbdfd 100644 --- a/app/src/main/res/layout/settings_fragment.xml +++ b/app/src/main/res/layout/settings_fragment.xml @@ -1,6 +1,7 @@ @@ -19,18 +20,6 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/deviceRadioGroup" /> - - - + + + + + + + + + + + + + + \ No newline at end of file From 45dbcab850c05a25393b283441b19fb3c5c579dc Mon Sep 17 00:00:00 2001 From: Vadim Furman Date: Fri, 5 Feb 2021 22:02:18 -0800 Subject: [PATCH 3/4] Cleanup --- .../com/geeksville/mesh/ui/SettingsFragment.kt | 18 ++++++------------ app/src/main/res/layout/settings_fragment.xml | 4 ++-- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt index 92933db54..004340bd0 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -462,7 +462,7 @@ class BTScanModel(app: Application) : AndroidViewModel(app), Logging { @SuppressLint("NewApi") class SettingsFragment : ScreenFragment("Settings"), Logging { - + private val MAX_INT_DEVICE = 0xFFFFFFFF private var _binding: SettingsFragmentBinding? = null // This property is only valid between onCreateView and onDestroyView. @@ -579,12 +579,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { }) model.radioConfig.observe(viewLifecycleOwner, { _ -> - var inMinutes = model.positionBroadcastSecs - if (inMinutes != null) { - inMinutes /= 60 - } - binding.positionBroadcastPeriodEditText.setText(inMinutes.toString()) - + binding.positionBroadcastPeriodEditText.setText(model.positionBroadcastSecs.toString()) binding.lsSleepEditText.setText(model.lsSleepSecs.toString()) }) @@ -620,9 +615,8 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { binding.positionBroadcastPeriodEditText.on(EditorInfo.IME_ACTION_DONE) { val str = binding.positionBroadcastPeriodEditText.text.toString() - var n = str.toIntOrNull() - if (n != null && n < 100000 && n >= 0) { - n *= 60 + val n = str.toIntOrNull() + if (n != null && n <= MAX_INT_DEVICE && n >= 0) { model.positionBroadcastSecs = n } else { binding.scanStatusText.text = "Bad value: $str" @@ -632,8 +626,8 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { binding.lsSleepEditText.on(EditorInfo.IME_ACTION_DONE) { val str = binding.lsSleepEditText.text.toString() - var n = str.toIntOrNull() - if (n != null && n < 100000 && n >= 0) { + val n = str.toIntOrNull() + if (n != null && n < MAX_INT_DEVICE && n >= 0) { model.lsSleepSecs = n } else { binding.scanStatusText.text = "Bad value: $str" diff --git a/app/src/main/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml index 8781cbdfd..97a82dd09 100644 --- a/app/src/main/res/layout/settings_fragment.xml +++ b/app/src/main/res/layout/settings_fragment.xml @@ -149,7 +149,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" - android:hint="Broadcast position period (minutes), 0 - disable" + android:hint="@string/broadcast_position_secs" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/warningNotPaired"> @@ -170,7 +170,7 @@ android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:layout_marginEnd="16dp" - android:hint="Sleep period, secs" + android:hint="@string/ls_sleep_secs" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/positionBroadcastPeriodView"> From 0f8357adb0c8312920f2ab7c216462f98a720bf5 Mon Sep 17 00:00:00 2001 From: Vadim Furman Date: Fri, 5 Feb 2021 22:05:24 -0800 Subject: [PATCH 4/4] String resources --- app/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3c3b111cb..b96c0e298 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -83,4 +83,6 @@ message reception time message reception state Message delivery status + Broadcast position period (in seconds), 0 - disable + Device sleep period (in seconds)