From f413bea6186f9eb6232a92171bc10251cb849913 Mon Sep 17 00:00:00 2001 From: Gunter Tim Date: Thu, 17 Sep 2020 00:37:51 -0700 Subject: [PATCH 1/3] Make 3 character short names from long name when long name is only one word --- .../java/com/geeksville/mesh/model/UIState.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) 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 eeb100c6b..1a260136f 100644 --- a/app/src/main/java/com/geeksville/mesh/model/UIState.kt +++ b/app/src/main/java/com/geeksville/mesh/model/UIState.kt @@ -17,12 +17,22 @@ 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. +/// 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(name: String): String { - val words = name.split(Regex("\\s+")).filter { it.isNotEmpty() }.take(3).map { it.first() } - .joinToString("") + val nchars = 3 + val minchars = 2 + 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 { From f97bc217198f17bb2ebeb219b862c590dd216ded Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Thu, 17 Sep 2020 19:49:50 +0200 Subject: [PATCH 2/3] simplified calls to system services and fixed some code that assumed BluetoothManager to never be NULL --- .../com/geeksville/mesh/android/ContextServices.kt | 12 ++++++++++++ .../com/geeksville/mesh/service/SafeBluetooth.kt | 6 ++---- .../com/geeksville/mesh/service/SerialInterface.kt | 10 ++++------ .../java/com/geeksville/mesh/ui/SettingsFragment.kt | 9 ++++----- 4 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/geeksville/mesh/android/ContextServices.kt diff --git a/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt b/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt new file mode 100644 index 000000000..511ba1324 --- /dev/null +++ b/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt @@ -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"} diff --git a/app/src/main/java/com/geeksville/mesh/service/SafeBluetooth.kt b/app/src/main/java/com/geeksville/mesh/service/SafeBluetooth.kt index 69ff4de7e..9bdeda6ae 100644 --- a/app/src/main/java/com/geeksville/mesh/service/SafeBluetooth.kt +++ b/app/src/main/java/com/geeksville/mesh/service/SafeBluetooth.kt @@ -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 diff --git a/app/src/main/java/com/geeksville/mesh/service/SerialInterface.kt b/app/src/main/java/com/geeksville/mesh/service/SerialInterface.kt index 9637f8bf3..00b802527 100644 --- a/app/src/main/java/com/geeksville/mesh/service/SerialInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/service/SerialInterface.kt @@ -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 { - 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() 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 a1bd80e07..04e272ebf 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -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(null) {} From 8de116bb0108b29b6290d3617c6e6a37141047ab Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Thu, 17 Sep 2020 19:55:36 +0200 Subject: [PATCH 3/3] safeguard for UsbService nullability because of the Java interface implying it --- .../main/java/com/geeksville/mesh/android/ContextServices.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt b/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt index 511ba1324..970dcdd51 100644 --- a/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt +++ b/app/src/main/java/com/geeksville/mesh/android/ContextServices.kt @@ -9,4 +9,4 @@ import android.hardware.usb.UsbManager */ 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"} +val Context.usbManager: UsbManager get() = requireNotNull(getSystemService(Context.USB_SERVICE) as? UsbManager?) { "USB_SERVICE is not available"}