From c57704013fbf820145dd5326f1ea525f98945205 Mon Sep 17 00:00:00 2001 From: geeksville Date: Wed, 10 Jun 2020 12:16:54 -0700 Subject: [PATCH] #38: USB device pairing now works across reboots --- .../geeksville/mesh/service/SerialInterface.kt | 16 +++++++++++----- .../com/geeksville/mesh/ui/SettingsFragment.kt | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) 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 0bac2490c..02834402f 100644 --- a/app/src/main/java/com/geeksville/mesh/service/SerialInterface.kt +++ b/app/src/main/java/com/geeksville/mesh/service/SerialInterface.kt @@ -22,6 +22,13 @@ class SerialInterface(private val service: RadioInterfaceService, val address: S private const val START2 = 0xc3.toByte() private const val MAX_TO_FROM_RADIO_SIZE = 512 + /** + * according to https://stackoverflow.com/questions/12388914/usb-device-access-pop-up-suppression/15151075#15151075 + * we should never ask for USB permissions ourselves, instead we should rely on the external dialog printed by the system. If + * we do that the system will remember we have accesss + */ + val assumePermission = true + fun findDrivers(context: Context): List { val manager = context.getSystemService(Context.USB_SERVICE) as UsbManager val drivers = UsbSerialProber.getDefaultProber().findAllDrivers(manager) @@ -35,7 +42,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 manager.hasPermission(d.device) + return assumePermission || manager.hasPermission(d.device) } return false } @@ -67,7 +74,7 @@ class SerialInterface(private val service: RadioInterfaceService, val address: S debug("attaching USB") val device: UsbDevice = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)!! val manager = context.getSystemService(Context.USB_SERVICE) as UsbManager - if (manager.hasPermission(device)) { + if (assumePermission || manager.hasPermission(device)) { // reinit the port from scratch and reopen onDeviceDisconnect() connect() @@ -118,11 +125,10 @@ class SerialInterface(private val service: RadioInterfaceService, val address: S val connection = manager.openDevice(device.device) if (connection == null) { // FIXME add UsbManager.requestPermission(device, ..) handling to activity - TODO("Need permissions for port") + errormsg("Need permissions for port") } else { val port = device.ports[0] // Most devices have just one port (port 0) - - connection + port.open(connection) port.setParameters(921600, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE) uart = device 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 03f8ba274..a0c42ae34 100644 --- a/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt +++ b/app/src/main/java/com/geeksville/mesh/ui/SettingsFragment.kt @@ -124,7 +124,7 @@ class BTScanModel(app: Application) : AndroidViewModel(app), Logging { class USBDeviceListEntry(usbManager: UsbManager, val usb: UsbSerialDriver) : DeviceListEntry( usb.device.deviceName, "s${usb.device.deviceName}", - usbManager.hasPermission(usb.device) + SerialInterface.assumePermission || usbManager.hasPermission(usb.device) ) override fun onCleared() {