From 798b3ede0488dc0c512fa85c75c64aec1624107f Mon Sep 17 00:00:00 2001 From: GiviMAD Date: Sun, 18 Sep 2022 17:44:59 +0200 Subject: [PATCH] [androiddebugbridge] fix get current package and get mac address (#13390) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Miguel Álvarez Signed-off-by: Miguel Álvarez --- .../internal/AndroidDebugBridgeDevice.java | 51 ++++++++++++++++++- .../internal/AndroidDebugBridgeHandler.java | 16 ++++-- 2 files changed, 62 insertions(+), 5 deletions(-) diff --git a/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeDevice.java b/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeDevice.java index 2404b1c82..c9588ce40 100644 --- a/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeDevice.java +++ b/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeDevice.java @@ -68,6 +68,9 @@ public class AndroidDebugBridgeDevice { "https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{2,256}\\.[a-z]{2,4}\\b([-a-zA-Z0-9@:%_\\+.~#?&//=]*)$"); private static final Pattern INPUT_EVENT_PATTERN = Pattern .compile("/(?\\S+): (?\\S+) (?\\S+) (?\\S+)$", Pattern.MULTILINE); + private static final Pattern VERSION_PATTERN = Pattern + .compile("^(?\\d+)(\\.)?(?\\d+)?(\\.)?(?\\*|\\d+)?"); + private static final Pattern MAC_PATTERN = Pattern.compile("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"); private static final Pattern SECURE_SHELL_INPUT_PATTERN = Pattern.compile("^[^\\|\\&;\\\"]+$"); @@ -97,6 +100,9 @@ public class AndroidDebugBridgeDevice { private @Nullable Socket socket; private @Nullable AdbConnection connection; private @Nullable Future commandFuture; + private int majorVersionNumber = 0; + private int minorVersionNumber = 0; + private int patchVersionNumber = 0; public AndroidDebugBridgeDevice(ScheduledExecutorService scheduler) { this.scheduler = scheduler; @@ -201,7 +207,12 @@ public class AndroidDebugBridgeDevice { public String getCurrentPackage() throws AndroidDebugBridgeDeviceException, InterruptedException, AndroidDebugBridgeDeviceReadException, TimeoutException, ExecutionException { - var out = runAdbShell("dumpsys", "window", "windows", "|", "grep", "mFocusedApp"); + String out; + if (isAtLeastVersion(10)) { + out = runAdbShell("dumpsys", "window", "displays", "|", "grep", "mFocusedApp"); + } else { + out = runAdbShell("dumpsys", "window", "windows", "|", "grep", "mFocusedApp"); + } var targetLine = Arrays.stream(out.split("\n")).findFirst().orElse(""); var lineParts = targetLine.split(" "); if (lineParts.length >= 2) { @@ -293,6 +304,19 @@ public class AndroidDebugBridgeDevice { return getDeviceProp("ro.build.version.release"); } + public void setAndroidVersion(String version) { + var matcher = VERSION_PATTERN.matcher(version); + if (!matcher.find()) { + logger.warn("Unable to parse android version"); + return; + } + this.majorVersionNumber = Integer.parseInt(matcher.group("major")); + var minorMatch = matcher.group("minor"); + var patchMatch = matcher.group("patch"); + this.minorVersionNumber = minorMatch != null ? Integer.parseInt(minorMatch) : 0; + this.patchVersionNumber = patchMatch != null ? Integer.parseInt(patchMatch) : 0; + } + public String getBrand() throws AndroidDebugBridgeDeviceException, InterruptedException, AndroidDebugBridgeDeviceReadException, TimeoutException, ExecutionException { return getDeviceProp("ro.product.brand"); @@ -305,7 +329,17 @@ public class AndroidDebugBridgeDevice { public String getMacAddress() throws AndroidDebugBridgeDeviceException, InterruptedException, AndroidDebugBridgeDeviceReadException, TimeoutException, ExecutionException { - return runAdbShell("cat", "/sys/class/net/wlan0/address").replace("\n", "").replace("\r", ""); + var macAddress = runAdbShell("cat", "/sys/class/net/wlan0/address").replace("\n", "").replace("\r", ""); + var matcher = MAC_PATTERN.matcher(macAddress); + if (!matcher.find()) { + macAddress = runAdbShell("ip", "address", "|", "grep", "-m", "1", "link/ether", "|", "awk", "'{print $2}'") + .replace("\n", "").replace("\r", ""); + matcher = MAC_PATTERN.matcher(macAddress); + if (matcher.find()) { + return macAddress; + } + } + return "00:00:00:00:00:00"; } private String getDeviceProp(String name) throws AndroidDebugBridgeDeviceException, InterruptedException, @@ -768,6 +802,19 @@ public class AndroidDebugBridgeDevice { } } + private boolean isAtLeastVersion(int major) { + return isAtLeastVersion(major, 0); + } + + private boolean isAtLeastVersion(int major, int minor) { + return isAtLeastVersion(major, minor, 0); + } + + private boolean isAtLeastVersion(int major, int minor, int patch) { + return majorVersionNumber > major || (majorVersionNumber == major + && (minorVersionNumber > minor || (minorVersionNumber == minor && patchVersionNumber >= patch))); + } + public static class VolumeInfo { public int current; public int min; diff --git a/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeHandler.java b/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeHandler.java index 25c13a5d1..5a1605721 100644 --- a/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeHandler.java +++ b/bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeHandler.java @@ -55,7 +55,6 @@ import com.google.gson.JsonSyntaxException; */ @NonNullByDefault public class AndroidDebugBridgeHandler extends BaseThingHandler { - public static final String KEY_EVENT_PLAY = "126"; public static final String KEY_EVENT_PAUSE = "127"; public static final String KEY_EVENT_NEXT = "87"; @@ -323,6 +322,11 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler { } adbConnection.configure(currentConfig.ip, currentConfig.port, currentConfig.timeout, currentConfig.recordDuration); + var androidVersion = thing.getProperties().get(Thing.PROPERTY_FIRMWARE_VERSION); + if (androidVersion != null) { + // configure android implementation to use + adbConnection.setAndroidVersion(androidVersion); + } updateStatus(ThingStatus.UNKNOWN); connectionCheckerSchedule = scheduler.scheduleWithFixedDelay(this::checkConnection, 0, currentConfig.refreshTime, TimeUnit.SECONDS); @@ -360,8 +364,11 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler { try { logger.debug("Refresh device {} status", currentConfig.ip); if (adbConnection.isConnected()) { + if (!ThingStatus.ONLINE.equals(getThing().getStatus())) { + // refresh properties only on state changes + refreshProperties(); + } updateStatus(ThingStatus.ONLINE); - refreshProperties(); refreshStatus(); } else { try { @@ -394,7 +401,10 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler { Map editProperties = editProperties(); editProperties.put(Thing.PROPERTY_SERIAL_NUMBER, adbConnection.getSerialNo()); editProperties.put(Thing.PROPERTY_MODEL_ID, adbConnection.getModel()); - editProperties.put(Thing.PROPERTY_FIRMWARE_VERSION, adbConnection.getAndroidVersion()); + var androidVersion = adbConnection.getAndroidVersion(); + editProperties.put(Thing.PROPERTY_FIRMWARE_VERSION, androidVersion); + // refresh android version to use + adbConnection.setAndroidVersion(androidVersion); editProperties.put(Thing.PROPERTY_VENDOR, adbConnection.getBrand()); try { editProperties.put(Thing.PROPERTY_MAC_ADDRESS, adbConnection.getMacAddress());