use List<WifiClient> in SoftApCallback to update client list

If we use the `ip neigh` command to get clients, we need to judge the reachability in the code.
Using the client list provided by WifiManager.SoftApCallback will not cause this problem
The result of the `ip neigh` command is only used to get the IP address.

Signed-off-by: cjybyjk <cjybyjk@zjnu.edu.cn>
Change-Id: I33ace64bbbd74492259a79709eb69e3cbefe8d92
diff --git a/app/src/main/java/org/exthmui/softap/ClientListActivity.java b/app/src/main/java/org/exthmui/softap/ClientListActivity.java
index 650e4f2..86c7055 100644
--- a/app/src/main/java/org/exthmui/softap/ClientListActivity.java
+++ b/app/src/main/java/org/exthmui/softap/ClientListActivity.java
@@ -125,7 +125,7 @@
                         continue;
                     }
                     mBlockedClients.addPreference(makeClientPreference(info));
-                } else if (info.isConnected()) {
+                } else {
                     removeConnectedPrefList.remove(info.getMACAddress());
                     if (mConnectedClients.findPreference(info.getMACAddress()) != null) {
                         continue;
diff --git a/app/src/main/java/org/exthmui/softap/SoftApManageService.java b/app/src/main/java/org/exthmui/softap/SoftApManageService.java
index 800050c..46b577a 100644
--- a/app/src/main/java/org/exthmui/softap/SoftApManageService.java
+++ b/app/src/main/java/org/exthmui/softap/SoftApManageService.java
@@ -80,12 +80,12 @@
     public SoftApManageService() {
     }
 
-    private Thread createClientUpdateThread() {
+    private Thread createClientUpdateThread(final List<WifiClient> clients) {
         return new Thread() {
             @Override
             public void run() {
                 try {
-                    IUpdateClientList();
+                    IUpdateClientList(clients);
                     sendStatusChangedMessage(STATUS_NORMAL);
                 } catch (Exception e) {
                     e.printStackTrace();
@@ -114,12 +114,11 @@
                         if (mClientUpdateThread != null &&
                                 mClientUpdateThread.getState() != Thread.State.NEW &&
                                 mClientUpdateThread.getState() != Thread.State.TERMINATED) {
-                            mHandler.sendEmptyMessageDelayed(MSG_UPDATE_CLIENT_LIST, 1000);
+                            mHandler.removeMessages(MSG_UPDATE_CLIENT_LIST);
+                            mHandler.sendMessageDelayed(msg, 1000);
                             return;
                         }
-                        if (mClientUpdateThread == null || mClientUpdateThread.getState() != Thread.State.NEW) {
-                            mClientUpdateThread = createClientUpdateThread();
-                        }
+                        mClientUpdateThread = createClientUpdateThread((List<WifiClient>) msg.obj);
                         mClientUpdateThread.start();
                     }
                 }
@@ -216,12 +215,22 @@
         return false;
     }
 
-    private void IUpdateClientList() {
+    private void IUpdateClientList(List<WifiClient> clients) {
 
         HashMap<String, ClientInfo> clientInfoHashMap = new HashMap<>();
 
         sendStatusChangedMessage(STATUS_CLIENTS_REFRESHING);
         // 取得当前连接的设备
+        for (WifiClient client : clients) {
+            String macAddress = client.getMacAddress().toString();
+            ClientInfo info = new ClientInfo(macAddress);
+            MACData macData = MACDataHelper.findMACData(macAddress);
+            if (macData != null) {
+                info.setManufacturer(macData.toString());
+            }
+            clientInfoHashMap.put(macAddress, info);
+        }
+        // MAC-IP 匹配
         String res = execCommand(String.format(IP_NEIGHBOR_COMMAND_FORMAT, mInterfaceName));
         if (!TextUtils.isEmpty(res)) {
             String[] lines = res.split("\n");
@@ -230,20 +239,10 @@
                 String ipAddress = values[COLUMN_IP_ADDRESS];
                 String macAddress = values[COLUMN_MAC_ADDRESS];
                 if (!isValidMACAddress(macAddress)) continue;
-                ClientInfo info;
                 if (clientInfoHashMap.containsKey(macAddress)) {
-                    info = clientInfoHashMap.get(macAddress);
-                } else {
-                    info = new ClientInfo(macAddress);
-                    MACData macData = MACDataHelper.findMACData(macAddress);
-                    if (macData != null) {
-                        info.setManufacturer(macData.toString());
-                    }
-                    clientInfoHashMap.put(macAddress, info);
+                    ClientInfo info = clientInfoHashMap.get(macAddress);
+                    info.addIPAddress(ipAddress);
                 }
-                if (info == null) continue;
-                info.addIPAddress(ipAddress);
-                info.setConnected(info.isConnected() || isReachable(ipAddress));
             }
         }
 
@@ -257,7 +256,6 @@
                 if (macData != null) {
                     info.setManufacturer(macData.toString());
                 }
-                info.setConnected(false);
                 info.setBlocked(true);
                 clientInfoHashMap.put(blockedMAC, info);
             }
@@ -281,14 +279,6 @@
         return ip != null && ip.matches("((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))");
     }
 
-    private boolean isReachable(String ip) {
-        try {
-            return InetAddress.getByName(ip).isReachable(1500);
-        } catch (IOException e) {
-            return false;
-        }
-    }
-
     private void sendStatusChangedMessage(int what) {
         Message msg = mHandler.obtainMessage();
         msg.what = MSG_STATUS_CHANGED;
@@ -325,7 +315,10 @@
 
     @Override
     public void onConnectedClientsChanged(List<WifiClient> clients) {
-        mHandler.sendEmptyMessageDelayed(MSG_UPDATE_CLIENT_LIST, 1000);
+        Message msg = mHandler.obtainMessage();
+        msg.what = MSG_UPDATE_CLIENT_LIST;
+        msg.obj = clients;
+        mHandler.sendMessage(msg);
     }
 
     private static String execCommand(String cmd) {
@@ -398,4 +391,4 @@
     public interface StatusListener {
         void onStatusChanged(int what);
     }
-}
\ No newline at end of file
+}