From 5dc55b52f60413773f9b0627f386af7ddfde2a86 Mon Sep 17 00:00:00 2001 From: andrekir Date: Sat, 5 Feb 2022 17:09:31 -0300 Subject: [PATCH 01/12] add confirmation dialog for firmware update --- .../main/java/com/geeksville/mesh/ui/SettingsFragment.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 4c63e4123..0aeb172d3 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -659,7 +659,14 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } binding.updateFirmwareButton.setOnClickListener { - doFirmwareUpdate() + MaterialAlertDialogBuilder(requireContext()) + .setMessage("${getString(R.string.update_firmware)}?") + .setNeutralButton(R.string.cancel) { _, _ -> + } + .setPositiveButton(getString(R.string.okay)) { _, _ -> + doFirmwareUpdate() + } + .show() } binding.usernameEditText.on(EditorInfo.IME_ACTION_DONE) { From 00810374ea2a96fa3110b747c00782df0c72ea4e Mon Sep 17 00:00:00 2001 From: andrekir Date: Sat, 5 Feb 2022 19:43:56 -0300 Subject: [PATCH 02/12] update dialog --- app/src/main/java/com/geeksville/mesh/MainActivity.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 3acc7c012..8cfd8667e 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -27,7 +27,6 @@ import android.view.View import android.widget.TextView import android.widget.Toast import androidx.activity.viewModels -import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.Toolbar @@ -1184,7 +1183,7 @@ class MainActivity : AppCompatActivity(), Logging, private fun chooseThemeDialog() { /// Prepare dialog and its items - val builder = AlertDialog.Builder(this) + val builder = MaterialAlertDialogBuilder(this) builder.setTitle(getString(R.string.choose_theme_title)) val styles = arrayOf( From 3001696f9ce499a2bf8d69086f840d6f99f6a39d Mon Sep 17 00:00:00 2001 From: andrekir Date: Sat, 5 Feb 2022 19:50:20 -0300 Subject: [PATCH 03/12] rename "save messages as csv" to "export rangetest.csv" --- app/src/main/java/com/geeksville/mesh/MainActivity.kt | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 1 - app/src/main/res/values-pl/strings.xml | 1 - app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 1 - app/src/main/res/values-zh/strings.xml | 1 - app/src/main/res/values/strings.xml | 2 +- 9 files changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 8cfd8667e..81aa3a42a 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -1155,7 +1155,7 @@ class MainActivity : AppCompatActivity(), Logging, val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "application/csv" - putExtra(Intent.EXTRA_TITLE, "messages.csv") + putExtra(Intent.EXTRA_TITLE, "rangetest.csv") } startActivityForResult(intent, CREATE_CSV_FILE) return true diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 84aaee0ff..bdaa4ffea 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -87,7 +87,7 @@ Región No se puede cambiar de canal porque la radio aún no está conectada. Por favor inténtelo de nuevo. 55.332244 34.442211 - Guardar mensajes como csv... + Guardar rangetest.csv Establecer las opciones de los canales Reiniciar ¿Estás seguro de que quieres cambiar al canal por defecto? diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index d785d78f3..2b567d09c 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -91,7 +91,6 @@ Régió Nem lehet csatornát váltani, mert a rádió nincs csatlakoztatva. Kérem próbálja meg újra. 55.332244 34.442211 - Üzenetek mentése csv fájlba... Csatorna paraméterek beállítása Újraindítás Biztosan meg akarja változtatni az alapértelmezett csatornát? diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index d8a523045..d5e0e74c0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -97,7 +97,6 @@ Region Nie można zmienić kanału, ponieważ urządzenie nie jest jeszcze połączone. Proszę spróbuj jeszcze raz. 55.332244 34.442211 - Zapisz wiadomości jako csv... Ustaw właściwości kanału. Reset Na pewno chcesz zmienić na domyślny kanał? diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 539762d77..17b3cc324 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -92,7 +92,7 @@ Região Não foi possível mudar de canal, rádio não conectado. Tente novamente. 55.332244 34.442211 - Salvar mensagens como .CSV… + Exportar rangetest.csv Configurar opções do canal Redefinir Tem certeza que quer mudar para o canal padrão? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 8c020a567..367449525 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -92,7 +92,7 @@ Região Não foi possível mudar de canal, rádio não conectado. Tente novamente. 55.332244 34.442211 - Salvar mensagens como .CSV… + Exportar rangetest.csv Configurar opções do canal Redefinir Tem certeza que quer mudar para o canal padrão? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 9f519becf..43e8cc17e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -95,7 +95,6 @@ Musíte nastaviť región! Región 48.14816 17.10674 - Ulož spávy ako CSV súbor Nastaviť kanál Resetovať Resetovať na základné (default) nastavenia diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index a1ac842ce..37137fb43 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -92,7 +92,6 @@ 地区 Couldn\'t change channel, because radio is not yet connected. Please try again. 55.332244 34.442211 - 将消息另存为csv文件 设置频道选项 重置 您确定要更改为默认频道吗? diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 41e99f78e..8833a0bf9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -96,7 +96,7 @@ Region Couldn\'t change channel, because radio is not yet connected. Please try again. 55.332244 34.442211 - Save messages as csv... + Export rangetest.csv Set channel options Reset Are you sure you want to change to the default channel? From 45895cdcf6408ff4689982b0264e7af6c9c75b0b Mon Sep 17 00:00:00 2001 From: andrekir Date: Mon, 7 Feb 2022 21:46:47 -0300 Subject: [PATCH 04/12] use same CompanionDeviceManager method --- .../java/com/geeksville/mesh/service/BluetoothInterface.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/geeksville/mesh/service/BluetoothInterface.kt b/app/src/main/java/com/geeksville/mesh/service/BluetoothInterface.kt index 50c860f71..1eba742a1 100644 --- a/app/src/main/java/com/geeksville/mesh/service/BluetoothInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/service/BluetoothInterface.kt @@ -113,7 +113,9 @@ class BluetoothInterface(val service: RadioInterfaceService, val address: String @SuppressLint("NewApi", "MissingPermission") override fun addressValid(context: Context, rest: String): Boolean { val allPaired = if (hasCompanionDeviceApi(context)) { - val deviceManager = context.getSystemService(CompanionDeviceManager::class.java) + val deviceManager: CompanionDeviceManager by lazy { + context.getSystemService(Context.COMPANION_DEVICE_SERVICE) as CompanionDeviceManager + } deviceManager.associations.map { it }.toSet() } else { getBluetoothAdapter(context)?.bondedDevices.orEmpty() From a42ba77bf2d080e061a5f283d095b77abe4db2cc Mon Sep 17 00:00:00 2001 From: andrekir Date: Mon, 7 Feb 2022 21:50:31 -0300 Subject: [PATCH 05/12] clean up snackbar --- app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt | 4 ++-- app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt index daf62a33c..6501add77 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/ChannelFragment.kt @@ -156,7 +156,7 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { requireActivity().startActivity(shareIntent) } catch (ex: ActivityNotFoundException) { Snackbar.make( - binding.shareButton, + requireView(), R.string.no_app_found, Snackbar.LENGTH_SHORT ).show() @@ -179,7 +179,7 @@ class ChannelFragment : ScreenFragment("Channel"), Logging { // Tell the user to try again Snackbar.make( - binding.editableCheckbox, + requireView(), R.string.radio_sleeping, Snackbar.LENGTH_SHORT ).show() 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 0aeb172d3..d016dc227 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -899,7 +899,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { fun weNeedAccess(warningReason: String) { warn("Telling user we need need location access") - Snackbar.make(binding.changeRadioButton, warningReason, Snackbar.LENGTH_INDEFINITE) + Snackbar.make(requireView(), warningReason, Snackbar.LENGTH_INDEFINITE) .apply { view.findViewById(R.id.snackbar_text).isSingleLine = false } .setAction(R.string.okay) { // dismiss @@ -969,7 +969,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { // Warn user if BLE is disabled if (scanModel.bluetoothAdapter?.isEnabled != true) { Snackbar.make( - binding.changeRadioButton, + requireView(), R.string.error_bluetooth, Snackbar.LENGTH_INDEFINITE ) From 94355e25f4397621da3c7ad4f7aca4eab494da5e Mon Sep 17 00:00:00 2001 From: andrekir Date: Tue, 8 Feb 2022 00:07:51 -0300 Subject: [PATCH 06/12] move CompanionDeviceManager back to SettingsFragment --- .../java/com/geeksville/mesh/MainActivity.kt | 65 --------------- .../geeksville/mesh/ui/SettingsFragment.kt | 80 ++++++++++++++++--- 2 files changed, 71 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/geeksville/mesh/MainActivity.kt b/app/src/main/java/com/geeksville/mesh/MainActivity.kt index 81aa3a42a..ae08caa88 100644 --- a/app/src/main/java/com/geeksville/mesh/MainActivity.kt +++ b/app/src/main/java/com/geeksville/mesh/MainActivity.kt @@ -4,11 +4,7 @@ import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.bluetooth.BluetoothAdapter -import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothManager -import android.companion.AssociationRequest -import android.companion.BluetoothDeviceFilter -import android.companion.CompanionDeviceManager import android.content.* import android.content.pm.PackageInfo import android.content.pm.PackageManager @@ -68,8 +64,6 @@ import kotlinx.coroutines.cancel import java.nio.charset.Charset import java.text.DateFormat import java.util.* -import java.util.regex.Pattern - /* UI design @@ -195,48 +189,6 @@ class MainActivity : AppCompatActivity(), Logging, updateBluetoothEnabled() } - fun startCompanionScan() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val deviceManager: CompanionDeviceManager by lazy { - getSystemService(Context.COMPANION_DEVICE_SERVICE) as CompanionDeviceManager - } - - // To skip filtering based on name and supported feature flags (UUIDs), - // don't include calls to setNamePattern() and addServiceUuid(), - // respectively. This example uses Bluetooth. - // We only look for Mesh (rather than the full name) because NRF52 uses a very short name - val deviceFilter: BluetoothDeviceFilter = BluetoothDeviceFilter.Builder() - .setNamePattern(Pattern.compile("Mesh.*")) - // .addServiceUuid(ParcelUuid(RadioInterfaceService.BTM_SERVICE_UUID), null) - .build() - - // The argument provided in setSingleDevice() determines whether a single - // device name or a list of device names is presented to the user as - // pairing options. - val pairingRequest: AssociationRequest = AssociationRequest.Builder() - .addDeviceFilter(deviceFilter) - .setSingleDevice(false) - .build() - - // When the app tries to pair with the Bluetooth device, show the - // appropriate pairing request dialog to the user. - deviceManager.associate(pairingRequest, - object : CompanionDeviceManager.Callback() { - override fun onDeviceFound(chooserLauncher: IntentSender) { - startIntentSenderForResult(chooserLauncher, - SELECT_DEVICE_REQUEST_CODE, null, 0, 0, 0) - } - - override fun onFailure(error: CharSequence?) { - warn("BLE selection service failed $error") - // changeDeviceSelection(mainActivity, null) // deselect any device - } - }, null - ) - } - else warn("startCompanionScan should not run on SDK < 26") - } - /** * Don't tell our app we have bluetooth until we have bluetooth _and_ location access */ @@ -496,8 +448,6 @@ class MainActivity : AppCompatActivity(), Logging, /* not yet working // Configure sign-in to request the user's ID, email address, and basic -// profile. ID and basic profile are included in DEFAULT_SIGN_IN. - // Configure sign-in to request the user's ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) @@ -623,7 +573,6 @@ class MainActivity : AppCompatActivity(), Logging, /** * Dispatch incoming result to the correct fragment. */ - @SuppressLint("InlinedApi", "MissingPermission") override fun onActivityResult( requestCode: Int, resultCode: Int, @@ -631,7 +580,6 @@ class MainActivity : AppCompatActivity(), Logging, ) { super.onActivityResult(requestCode, resultCode, data) - // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...); // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...); when (requestCode) { RC_SIGN_IN -> { @@ -641,19 +589,6 @@ class MainActivity : AppCompatActivity(), Logging, GoogleSignIn.getSignedInAccountFromIntent(data) handleSignInResult(task) } - (SELECT_DEVICE_REQUEST_CODE) -> when (resultCode) { - Activity.RESULT_OK -> { - val deviceToPair: BluetoothDevice = - data?.getParcelableExtra(CompanionDeviceManager.EXTRA_DEVICE)!! - if (deviceToPair.bondState != BluetoothDevice.BOND_BONDED) { - deviceToPair.createBond() - } - model.meshService?.let { service -> - MeshService.changeDeviceAddress(this@MainActivity, service, "x${deviceToPair.address}") - } - } - else -> warn("BLE device select intent failed") - } CREATE_CSV_FILE -> { if (resultCode == Activity.RESULT_OK) { data?.data?.let { file_uri -> model.saveMessagesCSV(file_uri) } 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 d016dc227..fcca3b178 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -1,28 +1,26 @@ package com.geeksville.mesh.ui import android.annotation.SuppressLint +import android.app.Activity import android.app.Application import android.app.PendingIntent import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothDevice.BOND_BONDED import android.bluetooth.BluetoothDevice.BOND_BONDING import android.bluetooth.le.* +import android.companion.AssociationRequest +import android.companion.BluetoothDeviceFilter +import android.companion.CompanionDeviceManager import android.content.* import android.content.pm.PackageManager import android.hardware.usb.UsbDevice import android.hardware.usb.UsbManager -import android.os.Bundle -import android.os.Handler -import android.os.Looper -import android.os.RemoteException +import android.os.* import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.inputmethod.EditorInfo -import android.widget.AdapterView -import android.widget.ArrayAdapter -import android.widget.RadioButton -import android.widget.TextView +import android.widget.* import androidx.fragment.app.activityViewModels import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData @@ -52,6 +50,7 @@ import com.hoho.android.usbserial.driver.UsbSerialDriver import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job +import java.util.regex.Pattern object SLogging : Logging @@ -456,6 +455,10 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { BluetoothInterface.hasCompanionDeviceApi(requireContext()) } + private val deviceManager: CompanionDeviceManager by lazy { + requireContext().getSystemService(Context.COMPANION_DEVICE_SERVICE) as CompanionDeviceManager + } + private val myActivity get() = requireActivity() as MainActivity override fun onDestroy() { @@ -851,6 +854,49 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } } + private fun startCompanionScan() { + // To skip filtering based on name and supported feature flags (UUIDs), + // don't include calls to setNamePattern() and addServiceUuid(), + // respectively. This example uses Bluetooth. + // We only look for Mesh (rather than the full name) because NRF52 uses a very short name + val deviceFilter: BluetoothDeviceFilter = BluetoothDeviceFilter.Builder() + .setNamePattern(Pattern.compile("Mesh.*")) + // .addServiceUuid(ParcelUuid(RadioInterfaceService.BTM_SERVICE_UUID), null) + .build() + + // The argument provided in setSingleDevice() determines whether a single + // device name or a list of device names is presented to the user as + // pairing options. + val pairingRequest: AssociationRequest = AssociationRequest.Builder() + .addDeviceFilter(deviceFilter) + .setSingleDevice(false) + .build() + + // When the app tries to pair with the Bluetooth device, show the + // appropriate pairing request dialog to the user. + deviceManager.associate( + pairingRequest, + object : CompanionDeviceManager.Callback() { + + override fun onDeviceFound(chooserLauncher: IntentSender) { + try { + startIntentSenderForResult( + chooserLauncher, + MainActivity.SELECT_DEVICE_REQUEST_CODE, null, 0, 0, 0, null + ) + } catch (ex: Throwable) { + errormsg("CompanionDevice startIntentSenderForResult error") + } + } + + override fun onFailure(error: CharSequence?) { + warn("BLE selection service failed $error") + // changeDeviceSelection(myActivity, null) // deselect any device + } + }, null + ) + } + private fun initModernScan() { binding.changeRadioButton.setOnClickListener { @@ -859,7 +905,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { myActivity.requestScanPermission() } else { // checkLocationEnabled() // ? some phones still need location turned on - myActivity.startCompanionScan() + startCompanionScan() } } } @@ -983,4 +1029,20 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + && requestCode == MainActivity.SELECT_DEVICE_REQUEST_CODE + && resultCode == Activity.RESULT_OK + ) { + val deviceToPair: BluetoothDevice = + data?.getParcelableExtra(CompanionDeviceManager.EXTRA_DEVICE)!! + if (deviceToPair.bondState != BOND_BONDED) { + deviceToPair.createBond() + } + changeDeviceSelection(myActivity, "x${deviceToPair.address}") + } else { + super.onActivityResult(requestCode, resultCode, data) + } + } } From 4abd8b8ab7463a4f00405803fd49a438e34237b9 Mon Sep 17 00:00:00 2001 From: andrekir Date: Tue, 8 Feb 2022 00:22:45 -0300 Subject: [PATCH 07/12] anonymize address log --- .../java/com/geeksville/mesh/service/RadioInterfaceService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt b/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt index c5f1deabc..ee8d00e0f 100644 --- a/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/RadioInterfaceService.kt @@ -269,7 +269,7 @@ class RadioInterfaceService : Service(), Logging { @SuppressLint("NewApi") private fun setBondedDeviceAddress(address: String?): Boolean { return if (getBondedDeviceAddress(this) == address && isStarted) { - warn("Ignoring setBondedDevice $address, because we are already using that device") + warn("Ignoring setBondedDevice ${address.anonymize}, because we are already using that device") false } else { // Record that this use has configured a new radio From 25e1ea2fb9a2d2069cb239af32d2fa221eb4114e Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 9 Feb 2022 00:57:34 -0300 Subject: [PATCH 08/12] add confirmation feedback to bug report --- app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt | 1 + 1 file changed, 1 insertion(+) 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 fcca3b178..969b57d0a 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -732,6 +732,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } .setPositiveButton(getString(R.string.report)) { _, _ -> reportError("Clicked Report A Bug") + Toast.makeText(requireContext(), "Bug report sent!", Toast.LENGTH_LONG).show() } .show() } From 956284192277889cd98931662607c96784c67278 Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 9 Feb 2022 01:17:34 -0300 Subject: [PATCH 09/12] add user feedback to changeRadioButton --- .../geeksville/mesh/ui/SettingsFragment.kt | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 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 969b57d0a..c68670765 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -657,10 +657,6 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } } - scanModel.devices.observe(viewLifecycleOwner) { devices -> - updateDevicesButtons(devices) - } - binding.updateFirmwareButton.setOnClickListener { MaterialAlertDialogBuilder(requireContext()) .setMessage("${getString(R.string.update_firmware)}?") @@ -823,6 +819,10 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { private fun initClassicScan() { + scanModel.devices.observe(viewLifecycleOwner) { devices -> + updateDevicesButtons(devices) + } + binding.changeRadioButton.setOnClickListener { debug("User clicked changeRadioButton") if (!myActivity.hasScanPermission()) { @@ -856,6 +856,9 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { } private fun startCompanionScan() { + // Disable the change button until our scan has some results + binding.changeRadioButton.isEnabled = false + // To skip filtering based on name and supported feature flags (UUIDs), // don't include calls to setNamePattern() and addServiceUuid(), // respectively. This example uses Bluetooth. @@ -880,13 +883,18 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { object : CompanionDeviceManager.Callback() { override fun onDeviceFound(chooserLauncher: IntentSender) { - try { - startIntentSenderForResult( - chooserLauncher, - MainActivity.SELECT_DEVICE_REQUEST_CODE, null, 0, 0, 0, null - ) - } catch (ex: Throwable) { - errormsg("CompanionDevice startIntentSenderForResult error") + debug("Found one device - enabling changeRadioButton") + binding.changeRadioButton.isEnabled = true + binding.changeRadioButton.setOnClickListener { + debug("User clicked changeRadioButton") + try { + startIntentSenderForResult( + chooserLauncher, + MainActivity.SELECT_DEVICE_REQUEST_CODE, null, 0, 0, 0, null + ) + } catch (ex: Throwable) { + errormsg("CompanionDevice startIntentSenderForResult error") + } } } @@ -900,15 +908,12 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { private fun initModernScan() { - binding.changeRadioButton.setOnClickListener { - debug("User clicked changeRadioButton") - if (!myActivity.hasScanPermission()) { - myActivity.requestScanPermission() - } else { - // checkLocationEnabled() // ? some phones still need location turned on - startCompanionScan() - } + scanModel.devices.observe(viewLifecycleOwner) { devices -> + updateDevicesButtons(devices) + startCompanionScan() } + + startCompanionScan() } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { From 3daa6eac46882e851cf4d28292695d78739148af Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 9 Feb 2022 22:47:28 -0300 Subject: [PATCH 10/12] use changeScanSelection after deviceManager association --- app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c68670765..119de127f 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -1046,7 +1046,7 @@ class SettingsFragment : ScreenFragment("Settings"), Logging { if (deviceToPair.bondState != BOND_BONDED) { deviceToPair.createBond() } - changeDeviceSelection(myActivity, "x${deviceToPair.address}") + scanModel.changeScanSelection(myActivity, "x${deviceToPair.address}") } else { super.onActivityResult(requestCode, resultCode, data) } From b075de057efb215ab056567d07644c4df6fcc0d0 Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 9 Feb 2022 22:48:59 -0300 Subject: [PATCH 11/12] update libs --- app/build.gradle | 5 +++-- build.gradle | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 05c86b0a7..687beb229 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -126,7 +126,7 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.4.1' implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.fragment:fragment-ktx:1.4.0' + implementation 'androidx.fragment:fragment-ktx:1.4.1' implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' @@ -174,7 +174,7 @@ dependencies { implementation 'com.google.android.gms:play-services-location:19.0.1' // For Google Sign-In (owner name accesss) - implementation 'com.google.android.gms:play-services-auth:20.0.1' + implementation 'com.google.android.gms:play-services-auth:20.1.0' // Add the Firebase SDK for Crashlytics. implementation 'com.google.firebase:firebase-crashlytics:18.2.6' @@ -188,6 +188,7 @@ dependencies { // barcode support // per https://github.com/journeyapps/zxing-android-embedded#older-sdk-versions for minSdkVersion 21 implementation('com.journeyapps:zxing-android-embedded:4.3.0') { transitive = false } + //noinspection GradleDependency implementation 'com.google.zxing:core:3.3.0' // <-- don't update def work_version = '2.7.1' diff --git a/build.gradle b/build.gradle index c46b6bd70..192514c53 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.0' + classpath 'com.android.tools.build:gradle:7.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" From 7ff28abd33baba516963f616d640db23d1bbc959 Mon Sep 17 00:00:00 2001 From: andrekir Date: Wed, 9 Feb 2022 22:49:55 -0300 Subject: [PATCH 12/12] 1.2.57 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 687beb229..776c7fa04 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -42,8 +42,8 @@ android { applicationId "com.geeksville.mesh" minSdkVersion 21 // The oldest emulator image I have tried is 22 (though 21 probably works) targetSdkVersion 30 // 30 can't work until an explicit location permissions dialog is added - versionCode 20256 // format is Mmmss (where M is 1+the numeric major number - versionName "1.2.56" + versionCode 20257 // format is Mmmss (where M is 1+the numeric major number + versionName "1.2.57" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // per https://developer.android.com/studio/write/vector-asset-studio