From cb52da6ad20c799d3de12424cca620dde62b070d Mon Sep 17 00:00:00 2001 From: gnssuser Date: Mon, 22 Sep 2025 15:30:37 +0200 Subject: [PATCH] Button list USB devices, show ports --- .../java/com/unicod/uarttest/MainActivity.kt | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/unicod/uarttest/MainActivity.kt b/app/src/main/java/com/unicod/uarttest/MainActivity.kt index 4a43e96..3c736b1 100644 --- a/app/src/main/java/com/unicod/uarttest/MainActivity.kt +++ b/app/src/main/java/com/unicod/uarttest/MainActivity.kt @@ -1,29 +1,47 @@ package com.unicod.uarttest +import android.annotation.SuppressLint +import android.app.Application +import android.content.Context import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge +import androidx.activity.viewModels +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.Button import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateListOf import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview +import androidx.lifecycle.AndroidViewModel +import com.hoho.android.usbserial.driver.UsbSerialDriver +import com.hoho.android.usbserial.driver.UsbSerialProber import com.unicod.uarttest.ui.theme.UartTestTheme +import android.hardware.usb.UsbManager +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Card +import androidx.compose.ui.unit.dp + class MainActivity : ComponentActivity() { + private val viewModel: UsbViewModel by viewModels() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { UartTestTheme { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - Greeting( - name = "Android", - modifier = Modifier.padding(innerPadding) - ) + UsbDeviceList(viewModel) } } } @@ -44,4 +62,53 @@ fun GreetingPreview() { UartTestTheme { Greeting("Android") } -} \ No newline at end of file +} + + +fun findUsbSerialDevices(context: Context): List { + val usbManager = context.getSystemService(Context.USB_SERVICE) as UsbManager + return UsbSerialProber.getDefaultProber().findAllDrivers(usbManager) +} + +class UsbViewModel(application: Application) : AndroidViewModel(application) { + private val _devices = mutableStateListOf() + val devices: List get() = _devices + + fun scanUsbDevices() { + val found = findUsbSerialDevices(getApplication()) + _devices.clear() + _devices.addAll(found) + } +} + +@Composable +fun UsbDeviceList(viewModel: UsbViewModel) { + val devices = viewModel.devices + + Column ( + modifier = Modifier + .fillMaxSize() + .padding(WindowInsets.statusBars.asPaddingValues()) + ) { + Button(onClick = { viewModel.scanUsbDevices() }) { + Text("Scan USB Devices") + } + + LazyColumn { + items(viewModel.devices) { driver -> + Card() { + Column(modifier = Modifier.padding(8.dp)) { + Text("Device: ${driver.device.deviceName}") + Text("Vendor ID: ${driver.device.vendorId}, Product ID: ${driver.device.productId}") + Text("Ports: ${driver.ports.size}") + + driver.ports.forEachIndexed { index, port -> + Text("↳ Port #$index", modifier = Modifier.padding(start = 16.dp)) + } + } + } + } + } + } +} +