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