Merge branch 'master' into bluetooth-state-receiver-readability

This commit is contained in:
Kevin Hester 2020-09-19 07:42:50 -07:00 committed by GitHub
commit c1a62097f4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 205 additions and 29 deletions

View file

@ -46,7 +46,7 @@ android {
defaultConfig {
// We have to list all translated languages here, because some of our libs have bogus languages that google play
// doesn't like and we need to strip them (gr)
resConfigs "cs", "de", "el", "en", "es", "fi", "fr", "ga", "ht", "it", "ja", "nl", "pt", "ru", "sk", "sl", "sq", "sv", "tr", "zh"
resConfigs "cs", "de", "el", "en", "es", "fi", "fr", "ga", "ht", "it", "ja", "nl", "no", "pt", "ro", "ru", "sk", "sl", "sq", "sv", "tr", "zh"
// Needed to make mapbox work inside the firebase testlab - FIXME, alas, still doesn't work
ndk {

View file

@ -0,0 +1,12 @@
package com.geeksville.mesh.android
import android.bluetooth.BluetoothManager
import android.content.Context
import android.hardware.usb.UsbManager
/**
* @return null on platforms without a BlueTooth driver (i.e. the emulator)
*/
val Context.bluetoothManager: BluetoothManager? get() = getSystemService(Context.BLUETOOTH_SERVICE) as? BluetoothManager?
val Context.usbManager: UsbManager get() = requireNotNull(getSystemService(Context.USB_SERVICE) as? UsbManager?) { "USB_SERVICE is not available"}

View file

@ -17,12 +17,23 @@ import com.geeksville.mesh.MyNodeInfo
import com.geeksville.mesh.service.MeshService
/// Given a human name, strip out the first letter of the first three words and return that as the initials for
/// that user.
fun getInitials(name: String): String {
val words = name.split(Regex("\\s+")).filter { it.isNotEmpty() }.take(3).map { it.first() }
.joinToString("")
/// that user. If the original name is only one word, strip vowels from the original name and if the result is
/// 3 or more characters, use the first three characters. If not, just take the first 3 characters of the
/// original name.
fun getInitials(nameIn: String): String {
val nchars = 3
val minchars = 2
val name = nameIn.trim()
val words = name.split(Regex("\\s+")).filter { it.isNotEmpty() }
return words
val initials = when (words.size) {
in 0..minchars - 1 -> {
val nm = name.filterNot { c -> c.toLowerCase() in "aeiou" }
if (nm.length >= nchars) nm else name
}
else -> words.map { it.first() }.joinToString("")
}
return initials.take(nchars)
}
class UIViewModel(app: Application) : AndroidViewModel(app), Logging {

View file

@ -278,11 +278,18 @@ class MeshService : Service(), Logging {
warnUserAboutLocation()
}
is ApiException ->
if (exception.statusCode == 17) {
// error: cancelled by user
errormsg("User cancelled location access", exception)
} else {
Exceptions.report(exception)
when (exception.statusCode) {
17 ->
// error: cancelled by user
errormsg("User cancelled location access", exception)
8502 ->
// error: settings change unavailable
errormsg(
"Settings-change-unavailable, user disabled location access (globally?)",
exception
)
else ->
Exceptions.report(exception)
}
else ->
Exceptions.report(exception)

View file

@ -10,6 +10,7 @@ import com.geeksville.android.Logging
import com.geeksville.concurrent.CallbackContinuation
import com.geeksville.concurrent.Continuation
import com.geeksville.concurrent.SyncContinuation
import com.geeksville.mesh.android.bluetoothManager
import com.geeksville.util.exceptionReporter
import kotlinx.coroutines.*
import java.io.Closeable
@ -101,10 +102,7 @@ class SafeBluetooth(private val context: Context, private val device: BluetoothD
fun restartBle() {
GeeksvilleApplication.analytics.track("ble_restart") // record # of times we needed to use this nasty hack
errormsg("Doing emergency BLE restart")
val mgr =
context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
val adp = mgr.adapter
if (null != adp) {
context.bluetoothManager?.adapter?.let { adp ->
if (adp.isEnabled) {
adp.disable()
// TODO: display some kind of UI about restarting BLE

View file

@ -7,6 +7,7 @@ import android.content.IntentFilter
import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbManager
import com.geeksville.android.Logging
import com.geeksville.mesh.android.usbManager
import com.geeksville.util.exceptionReporter
import com.geeksville.util.ignoreException
import com.hoho.android.usbserial.driver.UsbSerialDriver
@ -32,8 +33,7 @@ class SerialInterface(private val service: RadioInterfaceService, val address: S
fun toInterfaceName(deviceName: String) = "s$deviceName"
fun findDrivers(context: Context): List<UsbSerialDriver> {
val manager = context.getSystemService(Context.USB_SERVICE) as UsbManager
val drivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager)
val drivers = UsbSerialProber.getDefaultProber().findAllDrivers(context.usbManager)
val devices = drivers.map { it.device }
devices.forEach { d ->
debug("Found serial port ${d.deviceName}")
@ -43,8 +43,7 @@ class SerialInterface(private val service: RadioInterfaceService, val address: S
fun addressValid(context: Context, rest: String): Boolean {
findSerial(context, rest)?.let { d ->
val manager = context.getSystemService(Context.USB_SERVICE) as UsbManager
return assumePermission || manager.hasPermission(d.device)
return assumePermission || context.usbManager.hasPermission(d.device)
}
return false
}
@ -75,8 +74,7 @@ class SerialInterface(private val service: RadioInterfaceService, val address: S
if (UsbManager.ACTION_USB_DEVICE_ATTACHED == intent.action) {
debug("attaching USB")
val device: UsbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)!!
val manager = context.getSystemService(Context.USB_SERVICE) as UsbManager
if (assumePermission || manager.hasPermission(device)) {
if (assumePermission || context.usbManager.hasPermission(device)) {
// reinit the port from scratch and reopen
onDeviceDisconnect(true)
connect()

View file

@ -33,6 +33,8 @@ import com.geeksville.android.isGooglePlayAvailable
import com.geeksville.concurrent.handledLaunch
import com.geeksville.mesh.MainActivity
import com.geeksville.mesh.R
import com.geeksville.mesh.android.bluetoothManager
import com.geeksville.mesh.android.usbManager
import com.geeksville.mesh.model.UIViewModel
import com.geeksville.mesh.service.BluetoothInterface
import com.geeksville.mesh.service.MeshService
@ -137,11 +139,8 @@ class BTScanModel(app: Application) : AndroidViewModel(app), Logging {
debug("BTScanModel cleared")
}
/// Note: may be null on platforms without a bluetooth driver (ie. the emulator)
val bluetoothAdapter =
(context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?)?.adapter
private val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager
val bluetoothAdapter = context.bluetoothManager?.adapter
private val usbManager get() = context.usbManager
var selectedAddress: String? = null
val errorText = object : MutableLiveData<String?>(null) {}

View file

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_settings">Innstillinger</string>
<string name="channel_name">Kanal Navn</string>
<string name="channel_options">Kanal valg</string>
<string name="share_button">Delingsknapp</string>
<string name="qr_code">QR kode</string>
<string name="unset">Lås opp</string>
<string name="connection_status">Tilkoblingsstatus</string>
<string name="application_icon">applikasjon ikon</string>
<string name="unknown_username">Ukjent Brukernavn</string>
<string name="user_avatar">Bruker symbol</string>
<string name="sample_message">hei, jeg fant skatten, den er like ved den store tigeren. Jeg er litt redd.</string>
<string name="send_text">Send Tekst</string>
<string name="warning_not_paired">Du har ikke paret en Meshtastic kompatibel radio med denne telefonen. Vennligst parr en enhet, og sett ditt brukernavn.\n\nDenne åpen kildekode applikasjonen er i alfa-testing, Hvis du finner problemer, vennligst post på vårt forum: meshtastic.discourse.group.\n\nFor mer informasjon, se vår nettside - www.meshtastic.org.</string>
<string name="username_unset">Brukernavn ikke satt</string>
<string name="your_name">Ditt Navn</string>
<string name="analytics_okay">Anonym brukerstatistikk og kræsjrapporter.</string>
<string name="looking_for_meshtastic_devices">Ser etter Meshtastic enheter...</string>
<string name="test__devname1" translatable="false">Meshtastic_ac23</string>
<string name="test_devname2" translatable="false">Meshtastic_1267</string>
<string name="requires_bluetooth">Denne applikasjonen krever blåtann tilgang.Vennligst gi tilgang i android instillinger.</string>
<string name="error_bluetooth">Feil - denne app krever blåtann</string>
<string name="starting_pairing">Starter paring</string>
<string name="pairing_failed">Paring feilet</string>
<string name="url_for_join">En URL for å bli med i et Meshtastic nett</string>
<string name="accept">Godta</string>
<string name="cancel">Avbrytl</string>
<string name="change_channel">Endre kanal</string>
<string name="are_you_sure_channel">Er du sikker på at du vil endre kanalen? All kommunikasjon med andre noder vil stanse, intill du deler de nye kanalinstillingene.</string>
<string name="new_channel_rcvd">Ny kanal URL mottatt</string>
<string name="do_you_want_switch">Vil du bytte til \'%s\' kanal?</string>
<string name="map_not_allowed">Du har slått av analytics. Desverre krever kartleverandøren vår (mapbox) at analytics er slått på for deres \'grtis\' plan. Så vi har slått av kartvisning.\n\n
Hvis du vil se kartet, må du slå på analytics i instillingspanelet (også, for øyeblikket, må du kanskje tvangsstoppe og restarte applikasjonen).\n\n
Hvis du er interessert i at vi betaler for mapbox(eller bytter kartleveradøt), vennligst post i meshtastic.discourse.group</string>
<string name="permission_missing">En påkrevet tilgang mangler, Meshtastic vil ikke fungere korrekt. Vennligst slå på i Android appliksjonsinstillinger.</string>
<string name="radio_sleeping">Radio sov.kunne ikke endre kanal</string>
<string name="report_bug">Rapporter Feil</string>
<string name="report_a_bug">Rapporter en feil</string>
<string name="report_bug_text">Er du sikker på at du vil rapportere en feil? Etter rapportering, vennligst posti meshtastic.discourse.group så vi kan matche rapporten med hva du fant</string>
<string name="report">Rapport</string>
<string name="select_radio">Velg radio</string>
<string name="current_pair">Du er nå paret med radio %s</string>
<string name="not_paired_yet">Du har ikke paret med en radio ennå</string>
<string name="change_radio">Endre radio</string>
<string name="please_pair">Venligst par enhet i Android instillinger.</string>
<string name="pairing_completed">Paring fullført, starter tjeneste</string>
<string name="pairing_failed_try_again">Paring feilet, vennligst velg igjen</string>
<string name="location_disabled">Lokasjonstilgang er slått av,kan ikke gi posisjon til mesh.</string>
<string name="share">Del</string>
<string name="disconnected">Frakoblet</string>
<string name="device_sleeping">Enhet sover</string>
<string name="connected_count">Tilkoblet: %s av %s på nett</string>
<string name="list_of_nodes">En liste over noder i nettverket</string>
<string name="update_firmware">Oppdater Firmware</string>
<string name="connected">Tilkoblet radio</string>
<string name="connected_to">Tilkoblet til radio (%s)</string>
<string name="not_connected">Ikke tilkoblet. velg radio nedenfor</string>
<string name="connected_sleeping">Tilkoblet radio, men den sover</string>
<string name="update_to">Oppdater til %s</string>
<string name="app_too_old">Applikasjon for gammel</string>
<string name="must_update">Du må oppdatere denne applikasjonen på Google Play store (eller Github). Den er for gammel til å snakke med denne radioen.</string>
<string name="none">Ingen (slå av)</string>
<string name="modem_config_short">Kort rekkevidde (men rask)</string>
<string name="modem_config_medium">Medium rekkevidde (men rask)</string>
<string name="modem_config_long">Lang rekkevidde (men langsommerer)</string>
<string name="modem_config_very_long">Veldig lang rekkevidde (men langsom)</string>
<string name="modem_config_unrecognized">IKKE GJENKJENT</string>
<string name="meshtastic_service_notifications">Meshtastic Tjeneste meldinger</string>
<string name="location_disabled_warning">Du må slå på (høy presisjon) lokasjonstjenester i Android Innstillinger</string>
<string name="about">Om</string>
<string name="a_list_of_nodes_in_the_mesh">En liste over noder i nettet</string>
<string name="text_messages">Tekstmeldinger</string>
<string name="channel_invalid">Denne kanall URL er ugyldig og kan ikke benyttes</string>
</resources>

View file

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="action_settings">Setări</string>
<string name="channel_name">Numele Canalului</string>
<string name="channel_options">Opțiunile Canalului</string>
<string name="share_button">Buton de share</string>
<string name="qr_code">Cod QR</string>
<string name="unset">Nesetat</string>
<string name="connection_status">Statusul conexiunii</string>
<string name="application_icon">Iconița aplicației</string>
<string name="unknown_username">Username Necunoscut</string>
<string name="user_avatar">Avatar</string>
<string name="sample_message">hey am găsit cache-ul, este chiar aici lângă marele tigru. Mi-e cam frică.</string>
<string name="send_text">Trimite textul</string>
<string name="warning_not_paired">Nu conectat vre-un dispozitiv care suportă Meshtastic cu acest telefon. Te rog, conectează un dispozitiv cu acest telefon.\n\n Acesta aplicație open-source se află în alpha-testing, dacă întâmpini probleme contactează-ne: meshtastic.discourse.group.\n\nPentru mai multe informații: - www.meshtastic.org.</string>
<string name="username_unset">Username nesetat</string>
<string name="your_name">Numele tău</string>
<string name="analytics_okay">Trimite în mod anonim statistici de utilizare și reporturi de crash.</string>
<string name="looking_for_meshtastic_devices">Caut dispozitive Meshtastic...</string>
<string name="requires_bluetooth">Această aplicație necesită access la bluetooth. Te rog acordă accesul în setările telefonului.</string>
<string name="error_bluetooth">Eroare - această aplicație necesită bluetooth</string>
<string name="starting_pairing">Încep să mă conectez</string>
<string name="pairing_failed">Conectare eșuată</string>
<string name="url_for_join">Un URL pentru a intră în rețeaua Meshtastic</string>
<string name="accept">Accept</string>
<string name="cancel">Renunta</string>
<string name="change_channel">Schimbă canalul</string>
<string name="are_you_sure_channel">Ești sigur că vrei să schimbi canalul? Toate comunicațiile cu alte noduri vor fi oprite până când setezi aceleași detalii pe alte noduri.</string>
<string name="new_channel_rcvd">Am primit un nou URL de canal</string>
<string name="do_you_want_switch">Vrei să faci schimbul \'%s\' canalului?</string>
<string name="map_not_allowed">Ai analiticele dezactivate. Din nefericire providerul hărților (mapbox) necesită analitice în planul \'gratuit\'. Așadar am dezactivat harta.\n\n
Dacă vrei să vezi harta, trebuie să pornești analiticele în panoul de setări (s-ar putea să fii nevoit să restartezi aplicația).\n\n
Dacă sugerezi să plătim pentru mapbox (sau să schimbăm providerul hărții), te rog, postează în meshtastic.discourse.group</string>
<string name="permission_missing">O permisiune necesară lipsește, Meshtastic nu o să funcționeze corespunzător. Te rugăm activează-o în setările Android.</string>
<string name="radio_sleeping">Nu am putut să schimb canalul deoarece dispozitivul era în sleep mode</string>
<string name="report_bug">Raportează Bug</string>
<string name="report_a_bug">Raportează un bug</string>
<string name="report_bug_text">Ești sigur că vrei să raportezi un bug? După ce ai raportat, te rog postează în meshtastic.discourse.group că să reușim să potrivim reportul tău cu ce ai găsit.</string>
<string name="report">Raportare</string>
<string name="select_radio">Selectează un dispozitiv</string>
<string name="current_pair">Ești conectat la dispozitiv-ul %s</string>
<string name="not_paired_yet">Nu ai conectat un dispozitiv încă.</string>
<string name="change_radio">Schimbă dispozitivul</string>
<string name="please_pair">Te rog connecteaza dispozitivul în setările Android.</string>
<string name="pairing_completed">Conectare reușită, începem serviciul</string>
<string name="pairing_failed_try_again">Conectare eșuată, te rog reselecteaza</string>
<string name="location_disabled">Accesul locației este dezactivat, nu putem furniza locația ta la rețea.</string>
<string name="share">Distribuie</string>
<string name="disconnected">Deconectat</string>
<string name="device_sleeping">Dispozitiv în sleep mode</string>
<string name="connected_count">Connectat: %s din %s online</string>
<string name="list_of_nodes">O lista cu nodurile din rețea</string>
<string name="update_firmware">Updateaza firmware-ul</string>
<string name="connected">Connectat la dispozitiv</string>
<string name="connected_to">Conectat la dispozitivul (%s)</string>
<string name="not_connected">Neconectat, selectează dispozitivul din lista de jos</string>
<string name="connected_sleeping">Connectat la dispozitivi, dar e în modul de sleep</string>
<string name="update_to">Updateaza către %s</string>
<string name="app_too_old">Aplicație prea veche</string>
<string name="must_update">Trebuie să updatezi această aplicație de pe Google Play (sau Github). Aplicația este prea veche pentru a comunica cu dispozitivul.</string>
<string name="none">Niciunul (dezactivat)</string>
<string name="modem_config_short">Rază scurtă (comunicare rapidă)</string>
<string name="modem_config_medium">Rază medie (comunicare rapidă)</string>
<string name="modem_config_long">Rază lungă (încet)</string>
<string name="modem_config_very_long">Rază foarte lungă (încet)</string>
<string name="modem_config_unrecognized">NERECUNOSCUT</string>
<string name="meshtastic_service_notifications">Notificările Sistemului Meshtastic</string>
<string name="location_disabled_warning">Trepuie să pornești serviciile de locație (de high accuracy) în setările Android</string>
<string name="about">Despre</string>
<string name="a_list_of_nodes_in_the_mesh">O lista cu nodurile din rețea</string>
<string name="text_messages">Mesaje Text</string>
<string name="channel_invalid">Acest URL de canal este invalid și nu poate fi folosit</string>
</resources>

View file

@ -12,8 +12,11 @@ import org.junit.Test
class UIUnitTest {
@Test
fun initialsGood() {
Assert.assertEquals(getInitials("Kevin Hester"), "KH")
Assert.assertEquals(getInitials(" Kevin Hester Lesser Cat "), "KHL")
Assert.assertEquals(getInitials(" "), "")
Assert.assertEquals("KH", getInitials("Kevin Hester"))
Assert.assertEquals("KHL", getInitials(" Kevin Hester Lesser Cat "))
Assert.assertEquals("", getInitials(" "))
Assert.assertEquals("gks", getInitials("geeksville"))
Assert.assertEquals("gee", getInitials("geek"))
Assert.assertEquals("gks", getInitials("geeks"))
}
}