From e2412dfcb868a3772f12067b8ac619a0838ff7b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?ylt=E5=A7=9A=E5=85=B0=E5=A4=A9?= Date: Fri, 10 Apr 2015 18:10:38 +0800 Subject: [PATCH] make device listener work --- .../android/impl/AndroidDeviceStore.java | 81 ++++++++++++------- .../android/test/AndroidDeviceTest.java | 2 +- .../device/node/service/DeviceService.java | 1 - gradle.properties | 1 + 4 files changed, 54 insertions(+), 31 deletions(-) diff --git a/device-api/src/main/java/org/cosysoft/device/android/impl/AndroidDeviceStore.java b/device-api/src/main/java/org/cosysoft/device/android/impl/AndroidDeviceStore.java index 81118d4..56d0561 100644 --- a/device-api/src/main/java/org/cosysoft/device/android/impl/AndroidDeviceStore.java +++ b/device-api/src/main/java/org/cosysoft/device/android/impl/AndroidDeviceStore.java @@ -1,9 +1,9 @@ package org.cosysoft.device.android.impl; -import java.util.HashMap; -import java.util.Map; -import java.util.TreeSet; - +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.DdmPreferences; +import com.android.ddmlib.IDevice; +import com.android.ddmlib.Log.LogLevel; import org.cosysoft.device.DeviceStore; import org.cosysoft.device.android.AndroidDevice; import org.cosysoft.device.exception.AndroidDeviceException; @@ -13,22 +13,20 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.DdmPreferences; -import com.android.ddmlib.IDevice; -import com.android.ddmlib.IDevice.DeviceState; -import com.android.ddmlib.Log.LogLevel; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.TreeSet; public class AndroidDeviceStore implements DeviceStore { protected static final Logger logger = LoggerFactory .getLogger(AndroidDeviceStore.class); - protected final TreeSet devices = new TreeSet<>(); - private Map connectedDevices = new HashMap<>(); + private Map connectedDevices = new HashMap<>(); private AndroidDebugBridge bridge; - private boolean shouldKeepAdbAlive; + private boolean shouldKeepAdbAlive = false; static class DeviceStoreHolder { @@ -37,7 +35,7 @@ static class DeviceStoreHolder { static AndroidDeviceStore init() { AndroidDeviceStore instance; instance = new AndroidDeviceStore(); - instance.initAndroidDevices(true); + instance.initAndroidDevices(false); return instance; } } @@ -54,17 +52,7 @@ public static AndroidDeviceStore getInstance() { public void initAndroidDevices(boolean shouldKeepAdbAlive) throws AndroidDeviceException { DdmPreferences.setLogLevel(LogLevel.VERBOSE.getStringValue()); - this.initializeAdbConnection(); - TreeSet androidDevices = this.getDevices(); - - if (androidDevices.isEmpty()) { - throw new DeviceNotFoundException( - "No android devices were found. Please start an Android hardware device via USB, " - + "or check other device offline problem such as open USB Debug"); - } - devices.addAll(androidDevices); - } /** @@ -112,18 +100,53 @@ protected void initializeAdbConnection() { for (int i = 0; i < devices.length; i++) { logger.info("devices state: {},{} ", devices[i].getName(), devices[i].getState()); - if (DeviceState.ONLINE == devices[i].getState()) { - connectedDevices.put(devices[i], new DefaultHardwareDevice( - devices[i])); + connectedDevices.put(devices[i], new DefaultHardwareDevice( + devices[i])); + } + + + bridge.addDeviceChangeListener(new AndroidDebugBridge.IDeviceChangeListener() { + @Override + public void deviceConnected(IDevice device) { + logger.info("deviceConnected {}", device.getSerialNumber()); + AndroidDevice ad = new DefaultHardwareDevice(device); + Iterator> entryIterator = connectedDevices.entrySet().iterator(); + boolean contain = false; + while (entryIterator.hasNext()) { + Map.Entry entry = entryIterator.next(); + if (entry.getValue().equals(ad)) { + contain = true; + break; + } + } + if (!contain) { + connectedDevices.put(device, ad); + } } - } - this.devices.addAll(connectedDevices.values()); + @Override + public void deviceDisconnected(IDevice device) { + logger.info("deviceDisconnected {}", device.getSerialNumber()); + AndroidDevice ad = new DefaultHardwareDevice(device); + Iterator> entryIterator = connectedDevices.entrySet().iterator(); + while (entryIterator.hasNext()) { + Map.Entry entry = entryIterator.next(); + if (entry.getValue().equals(ad)) { + entryIterator.remove(); + } + } + } + + @Override + public void deviceChanged(IDevice device, int changeMask) { + logger.info(device.getSerialNumber() + " " + changeMask); + } + }); } @Override public TreeSet getDevices() { - return new TreeSet(devices); + return new TreeSet(connectedDevices.values()); } @Override diff --git a/device-api/src/test/java/org/cosysoft/device/android/test/AndroidDeviceTest.java b/device-api/src/test/java/org/cosysoft/device/android/test/AndroidDeviceTest.java index 834c137..83a8fc9 100644 --- a/device-api/src/test/java/org/cosysoft/device/android/test/AndroidDeviceTest.java +++ b/device-api/src/test/java/org/cosysoft/device/android/test/AndroidDeviceTest.java @@ -40,6 +40,6 @@ protected TreeSet getDevices() { @AfterClass public static void tearDown() { - deviceStore.shutdown(); + deviceStore.shutdownForcely(); } } diff --git a/device-node/src/main/java/org/cosysoft/device/node/service/DeviceService.java b/device-node/src/main/java/org/cosysoft/device/node/service/DeviceService.java index e98a438..ed81fc5 100644 --- a/device-node/src/main/java/org/cosysoft/device/node/service/DeviceService.java +++ b/device-node/src/main/java/org/cosysoft/device/node/service/DeviceService.java @@ -34,7 +34,6 @@ public byte[] takeScreenShot(String serialId) { return ImageUtils.toByteArray(image); } - @Cacheable(value = "devices") public List getDevices() { List deviceInfos = new ArrayList<>(); deviceStore.getDevices().forEach(device -> { diff --git a/gradle.properties b/gradle.properties index b8e9359..7fbf516 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1,2 @@ +#org.gradle.java.home=C:/Program Files/Java/jdk1.8.0_40 systemProp.file.encoding=utf-8 \ No newline at end of file