From 998b8b32b7abcd348a9f32611ce0091057ff914b Mon Sep 17 00:00:00 2001 From: chrisdebian Date: Sat, 27 Jun 2026 12:56:46 +0100 Subject: [PATCH 1/2] refactor: replace deprecated AsyncTask in UsbDeviceListActivity AsyncTask was deprecated in API 30 and the usages triggered @SuppressLint("StaticFieldLeak") and @SuppressLint("HandlerLeak") suppression annotations. Replace with a single-thread ExecutorService for background USB discovery and mHandler.post() to deliver results to the main thread. Also pass Looper.getMainLooper() explicitly to the Handler constructor to silence the implicit-looper deprecation warning. --- .../gui/androbd/UsbDeviceListActivity.java | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java b/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java index ab695e84..ae59cb3e 100644 --- a/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java +++ b/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java @@ -19,15 +19,14 @@ package com.fr3ts0n.ecu.gui.androbd; -import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.hardware.usb.UsbDevice; import android.hardware.usb.UsbManager; -import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.view.LayoutInflater; import android.view.View; @@ -44,6 +43,8 @@ import com.hoho.android.usbserial.driver.UsbSerialProber; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.logging.Logger; /** @@ -62,9 +63,9 @@ public final class UsbDeviceListActivity extends Activity private UsbManager mUsbManager; private static final int MESSAGE_REFRESH = 101; private static final long REFRESH_TIMEOUT_MILLIS = 5000; + private final ExecutorService mExecutor = Executors.newSingleThreadExecutor(); - @SuppressLint("HandlerLeak") - private final Handler mHandler = new Handler() + private final Handler mHandler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) @@ -174,43 +175,30 @@ public final class UsbDeviceListActivity extends Activity mHandler.removeMessages(MESSAGE_REFRESH); } - @SuppressLint("StaticFieldLeak") + @SuppressLint("StringFormatInvalid") private void refreshDeviceList() { - new AsyncTask>() - { - @Override - protected List doInBackground(Void... params) + mExecutor.submit(() -> { + log.fine("Refreshing device list ..."); + final List drivers = + UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager); + final List result = new ArrayList<>(); + for (final UsbSerialDriver driver : drivers) { - log.fine("Refreshing device list ..."); - final List drivers = - UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager); - final List result = new ArrayList<>(); - - for (final UsbSerialDriver driver : drivers) - { - final List ports = driver.getPorts(); - log.fine(String.format("+ %s: %s selectedPort%s", - driver, ports.size(), - ports.size() == 1 ? "" : "s")); - result.addAll(ports); - } - - return result; + final List ports = driver.getPorts(); + log.fine(String.format("+ %s: %s selectedPort%s", + driver, ports.size(), + ports.size() == 1 ? "" : "s")); + result.addAll(ports); } - - @SuppressLint("StringFormatInvalid") - @Override - protected void onPostExecute(List result) - { + mHandler.post(() -> { mEntries.clear(); mEntries.addAll(result); TextView numFound = findViewById(R.id.num_found); numFound.setText(getString(R.string.devices_found, result.size())); mAdapter.notifyDataSetChanged(); log.fine("Done refreshing, " + mEntries.size() + " entries found."); - } - - }.execute(); + }); + }); } } From a048400e2d1b7eed05ae504750d30e21b1e924d7 Mon Sep 17 00:00:00 2001 From: chrisdebian Date: Sat, 27 Jun 2026 13:10:20 +0100 Subject: [PATCH 2/2] fix: restore missing SuppressLint import in UsbDeviceListActivity Removing the @SuppressLint("StaticFieldLeak") annotation dropped the import, but @SuppressLint("StringFormatInvalid") on refreshDeviceList still needs it, causing a compile error. --- .../java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java b/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java index ae59cb3e..9ddcb9d7 100644 --- a/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java +++ b/androbd/src/main/java/com/fr3ts0n/ecu/gui/androbd/UsbDeviceListActivity.java @@ -19,6 +19,7 @@ package com.fr3ts0n.ecu.gui.androbd; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent;