mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
Merge branch 'master' into bluetooth-state-receiver-readability
This commit is contained in:
commit
c1a62097f4
10 changed files with 205 additions and 29 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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"}
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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) {}
|
||||
|
|
|
|||
75
app/src/main/res/values-no/strings.xml
Normal file
75
app/src/main/res/values-no/strings.xml
Normal 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>
|
||||
73
app/src/main/res/values-ro/strings.xml
Normal file
73
app/src/main/res/values-ro/strings.xml
Normal 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>
|
||||
|
|
@ -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"))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue