SearchWiFiDirectPrinterTask.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package com.epson.mobilephone.common.wifidirect;
  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.IntentFilter;
  6. import android.net.wifi.ScanResult;
  7. import android.net.wifi.WifiManager;
  8. import android.net.wifi.p2p.WifiP2pDevice;
  9. import android.net.wifi.p2p.WifiP2pDeviceList;
  10. import android.net.wifi.p2p.WifiP2pManager;
  11. import android.os.AsyncTask;
  12. import android.os.Build;
  13. import android.os.Bundle;
  14. import android.os.Handler;
  15. import android.os.Message;
  16. import android.os.SystemClock;
  17. import com.epson.mobilephone.common.wifidirect.SimpleAPInfoDB;
  18. import com.epson.mobilephone.common.wifidirect.WiFiControl;
  19. import com.epson.mobilephone.common.wifidirect.WifiP2pUtils;
  20. import epson.print.CommonDefine;
  21. import java.util.ArrayList;
  22. import java.util.Collection;
  23. import java.util.List;
  24. public class SearchWiFiDirectPrinterTask {
  25. private static final int DELEY_SEARCH = 1000;
  26. public static final String MACADDR_INFRA = "addr_infra";
  27. public static final String MACADDR_P2P = "addr_p2p";
  28. private static final int MAX_RETRY_SCANNING = 5;
  29. private static final int MAX_RETRY_SCANNING_CHECKINGTIME = 3;
  30. private static final int MAX_RETRY_SCANNING_P2P = 30;
  31. private static final int MAX_SCANRESULT_TIME = 30000;
  32. public static final String NETWORK_ID = "id";
  33. public static final String PRINTER_NAME = "name";
  34. public static final int PRINTER_P2P = 2;
  35. public static final int PRINTER_SIMPLEAP = 1;
  36. public static final String PRINTER_SSID = "ssid";
  37. public static final int SCANNING_TIMEOUT = 15;
  38. public static final String TAG = "SearchWiFiDirectPrinterTask";
  39. protected static long lastScan;
  40. private static SearchWiFiDirectPrinterTask searchWiFiDirectPrinterTask;
  41. private final int DISCOVER_PEERS = 0;
  42. boolean bDisConnectP2P = false;
  43. Context context = null;
  44. int idResult = 0;
  45. ArrayList<String> listFoundSSID = new ArrayList<>();
  46. Handler mHandler = null;
  47. WifiP2pManager mWiFiP2PManager = null;
  48. WifiManager mWifiManager = null;
  49. NetworkStateChangeReciever networkStateChangeReciever = null;
  50. WifiP2pManager.Channel p2pChannnel = null;
  51. WiFiDirectBroadcastReceiver p2pStateChangeReciever = null;
  52. int retryScaning = 0;
  53. int retryScaningP2P = 0;
  54. ScanningObserver scannigObserver = new ScanningObserver();
  55. Handler searchHandler = new Handler(new Handler.Callback() {
  56. public boolean handleMessage(Message message) {
  57. if (message.what == 0) {
  58. WifiP2pUtils.ConnectionInfo connectionInfo = WifiP2pUtils.getInstance(SearchWiFiDirectPrinterTask.this.context).getConnectionInfo();
  59. if (connectionInfo != null) {
  60. if (MacAddrFilter.getInstance(SearchWiFiDirectPrinterTask.this.context).isExcludedMacAddress(WiFiControl.p2pAddr2PtrAddr(connectionInfo.p2PMacAdder, connectionInfo.printerName))) {
  61. SearchWiFiDirectPrinterTask.this.bDisConnectP2P = true;
  62. }
  63. }
  64. SearchWiFiDirectPrinterTask.mWiFiP2PManager.discoverPeers(SearchWiFiDirectPrinterTask.this.p2pChannnel, new WifiP2pManager.ActionListener() {
  65. public void onSuccess() {
  66. EPLog.m86d(SearchWiFiDirectPrinterTask.TAG, "discoverPeers Start");
  67. SearchWiFiDirectPrinterTask.this.serarchingStatus |= 2;
  68. }
  69. public void onFailure(int i) {
  70. switch (i) {
  71. case 0:
  72. EPLog.m90w(SearchWiFiDirectPrinterTask.TAG, "P2P_Operation ERROR");
  73. break;
  74. case 1:
  75. EPLog.m90w(SearchWiFiDirectPrinterTask.TAG, "P2P_Operation P2P_UNSUPPORTED");
  76. break;
  77. case 2:
  78. EPLog.m90w(SearchWiFiDirectPrinterTask.TAG, "P2P_Operation BUSY");
  79. if (!SearchWiFiDirectPrinterTask.this.bDisConnectP2P && WifiP2pUtils.getInstance(SearchWiFiDirectPrinterTask.this.context).isConnectedWiFiP2P()) {
  80. EPLog.m90w(SearchWiFiDirectPrinterTask.TAG, "Disconnect P2P and And Retry");
  81. WifiP2pUtils.getInstance(SearchWiFiDirectPrinterTask.this.context).disconnect();
  82. SearchWiFiDirectPrinterTask.this.bDisConnectP2P = true;
  83. SearchWiFiDirectPrinterTask.this.searchHandler.sendEmptyMessageDelayed(0, 1000);
  84. return;
  85. }
  86. default:
  87. EPLog.m90w(SearchWiFiDirectPrinterTask.TAG, "P2P_Operation Fail");
  88. break;
  89. }
  90. if (SearchWiFiDirectPrinterTask.this.serarchingStatus == 0) {
  91. SearchWiFiDirectPrinterTask.mHandler.sendEmptyMessage(SearchWiFiDirectPrinterTask.this.idResult);
  92. }
  93. }
  94. });
  95. }
  96. return true;
  97. }
  98. });
  99. volatile int serarchingStatus = 0;
  100. int timeout = 15;
  101. public static SearchWiFiDirectPrinterTask getInstance(Context context2) {
  102. SearchWiFiDirectPrinterTask searchWiFiDirectPrinterTask2 = searchWiFiDirectPrinterTask;
  103. if (searchWiFiDirectPrinterTask2 != null) {
  104. return searchWiFiDirectPrinterTask2;
  105. }
  106. searchWiFiDirectPrinterTask = new SearchWiFiDirectPrinterTask(context2);
  107. return searchWiFiDirectPrinterTask;
  108. }
  109. private SearchWiFiDirectPrinterTask(Context context2) {
  110. context = context2.getApplicationContext();
  111. mWifiManager = (WifiManager) context2.getSystemService("wifi");
  112. mWiFiP2PManager = (WifiP2pManager) context2.getSystemService("wifip2p");
  113. WifiP2pManager wifiP2pManager = mWiFiP2PManager;
  114. if (wifiP2pManager != null) {
  115. p2pChannnel = wifiP2pManager.initialize(context2, context2.getMainLooper(), (WifiP2pManager.ChannelListener) null);
  116. }
  117. }
  118. private boolean start(int i, Handler handler, int i2, int i3) {
  119. if (this.serarchingStatus != 0) {
  120. EPLog.m86d(TAG, "Already started");
  121. return true;
  122. }
  123. EPLog.m86d(TAG, "start()");
  124. mHandler = handler;
  125. idResult = i2;
  126. timeout = i3;
  127. if (!mWifiManager.isWifiEnabled()) {
  128. return false;
  129. }
  130. listFoundSSID.clear();
  131. retryScaning = 0;
  132. retryScaningP2P = 0;
  133. scannigObserver.start(i3 * 1000);
  134. if ((i & 1) != 0) {
  135. networkStateChangeReciever = new NetworkStateChangeReciever();
  136. context.registerReceiver(this.networkStateChangeReciever, new IntentFilter("android.net.wifi.SCAN_RESULTS"));
  137. serarchingStatus |= 1;
  138. onScanResultAvailable();
  139. }
  140. if (!((i & 2) == 0 || mWiFiP2PManager == null || p2pChannnel == null)) {
  141. p2pStateChangeReciever = new WiFiDirectBroadcastReceiver();
  142. context.registerReceiver(this.p2pStateChangeReciever, new IntentFilter("android.net.wifi.p2p.PEERS_CHANGED"));
  143. bDisConnectP2P = false;
  144. searchHandler.sendEmptyMessage(0);
  145. }
  146. return true;
  147. }
  148. public void interrupt() {
  149. EPLog.m86d(TAG, "interrupt()");
  150. Handler handler = searchHandler;
  151. if (handler != null) {
  152. handler.removeMessages(0);
  153. }
  154. scannigObserver.interrunpt();
  155. if (!(mWiFiP2PManager == null || p2pChannnel == null)) {
  156. EPLog.m86d(TAG, "stopPeerDiscovery");
  157. mWiFiP2PManager.stopPeerDiscovery(this.p2pChannnel, (WifiP2pManager.ActionListener) null);
  158. }
  159. unRegisterReceiverSimpleAp();
  160. unRegisterReceiverP2P();
  161. serarchingStatus = 0;
  162. }
  163. private void unRegisterReceiverSimpleAp() {
  164. NetworkStateChangeReciever networkStateChangeReciever2 = networkStateChangeReciever;
  165. if (networkStateChangeReciever2 != null) {
  166. try {
  167. context.unregisterReceiver(networkStateChangeReciever2);
  168. } catch (IllegalArgumentException e) {
  169. e.printStackTrace();
  170. }
  171. networkStateChangeReciever = null;
  172. }
  173. }
  174. private void unRegisterReceiverP2P() {
  175. WiFiDirectBroadcastReceiver wiFiDirectBroadcastReceiver = p2pStateChangeReciever;
  176. if (wiFiDirectBroadcastReceiver != null) {
  177. try {
  178. context.unregisterReceiver(wiFiDirectBroadcastReceiver);
  179. } catch (IllegalArgumentException e) {
  180. e.printStackTrace();
  181. }
  182. p2pStateChangeReciever = null;
  183. }
  184. }
  185. private void onScanResultAvailable() {
  186. boolean z;
  187. int existSimpleApDisabled;
  188. long elapsedRealtime = SystemClock.elapsedRealtime();
  189. if (Build.VERSION.SDK_INT >= 17) {
  190. z = true;
  191. } else {
  192. long j = lastScan;
  193. if (j != 0 && elapsedRealtime - j < 30000) {
  194. EPLog.m88i(TAG, "onScanResultAvailable, use this Result");
  195. z = true;
  196. } else if (this.retryScaning > 0) {
  197. EPLog.m88i(TAG, "onScanResultAvailable, use this Retry Result");
  198. z = true;
  199. } else {
  200. EPLog.m90w(TAG, "onScanResultAvailable, ignore this Result");
  201. z = false;
  202. }
  203. }
  204. if (z) {
  205. List<ScanResult> arrayList = new ArrayList<>();
  206. try {
  207. arrayList = mWifiManager.getScanResults();
  208. } catch (SecurityException e) {
  209. e.printStackTrace();
  210. }
  211. if (arrayList.size() != 0) {
  212. for (ScanResult scanResult : arrayList) {
  213. if (this.retryScaning < 3 && Build.VERSION.SDK_INT >= 17) {
  214. long j2 = elapsedRealtime - (scanResult.timestamp / 1000);
  215. if (j2 >= 30000) {
  216. EPLog.m90w(TAG, "onScanResultAvailable, Ignore for timeout : SSID =" + scanResult.SSID + " past " + j2 + " msec");
  217. }
  218. }
  219. String removeQuotationsInSSID = WiFiUtils.removeQuotationsInSSID(scanResult.SSID);
  220. if (WiFiControl.isSimpleAP(removeQuotationsInSSID)) {
  221. int networkId = WiFiUtils.getInstance(this.context).getNetworkId(removeQuotationsInSSID);
  222. if (networkId != -1) {
  223. onFindPrinterResult(WiFiControl.addSSIDPrefix(removeQuotationsInSSID, WiFiControl.ConnectType.SimpleAP), networkId, scanResult.BSSID);
  224. } else if (Build.VERSION.SDK_INT < 23 && (existSimpleApDisabled = WiFiUtils.getInstance(this.context).getExistSimpleApDisabled(removeQuotationsInSSID)) != -1) {
  225. onFindPrinterResult(WiFiControl.addSSIDPrefix(removeQuotationsInSSID, WiFiControl.ConnectType.SimpleAP), existSimpleApDisabled, scanResult.BSSID);
  226. }
  227. }
  228. }
  229. }
  230. }
  231. lastScan = elapsedRealtime;
  232. retryScaning++;
  233. if (this.retryScaning < 5) {
  234. EPLog.m88i(TAG, "Retry startScan()");
  235. mWifiManager.startScan();
  236. return;
  237. }
  238. EPLog.m88i(TAG, "MAX_RETRY_SCANING");
  239. unRegisterReceiverSimpleAp();
  240. serarchingStatus &= -2;
  241. if (this.serarchingStatus == 0) {
  242. mHandler.sendEmptyMessage(this.idResult);
  243. interrupt();
  244. }
  245. }
  246. private void onFindPrinterResult(String str, int i, String str2) {
  247. if (!this.listFoundSSID.contains(str)) {
  248. listFoundSSID.add(str);
  249. SimpleAPInfoDB.SimpleAPInfo simpleAPInfoDB = SimpleAPInfoDB.getSimpleAPInfoDB(this.context, str);
  250. if (simpleAPInfoDB == null) {
  251. simpleAPInfoDB = new SimpleAPInfoDB.SimpleAPInfo();
  252. simpleAPInfoDB.ssid = str;
  253. WiFiControl.getInstance(this.context);
  254. simpleAPInfoDB.printerName = WiFiControl.getPrinterNetworkName(str);
  255. }
  256. Message obtain = Message.obtain();
  257. obtain.what = idResult;
  258. Bundle bundle = new Bundle();
  259. bundle.putString("ssid", simpleAPInfoDB.ssid);
  260. bundle.putString("name", simpleAPInfoDB.printerName);
  261. bundle.putInt("id", i);
  262. bundle.putString(MACADDR_P2P, str2);
  263. if (-1 != i) {
  264. bundle.putString(MACADDR_INFRA, WiFiControl.p2pAddr2PtrAddr(str2, (String) null));
  265. } else {
  266. bundle.putString(MACADDR_INFRA, WiFiControl.p2pAddr2PtrAddr(str2, simpleAPInfoDB.ssid));
  267. }
  268. EPLog.m86d(TAG, "onFindPrinterResult() data = " + bundle.getString("ssid") + CommonDefine.SLASH + bundle.getString("name") + CommonDefine.SLASH + bundle.getString(MACADDR_INFRA) + CommonDefine.SLASH + bundle.getString(MACADDR_P2P));
  269. obtain.setData(bundle);
  270. mHandler.sendMessage(obtain);
  271. }
  272. }
  273. class NetworkStateChangeReciever extends BroadcastReceiver {
  274. NetworkStateChangeReciever() {
  275. }
  276. public void onReceive(Context context, Intent intent) {
  277. if (intent.getAction().equals("android.net.wifi.SCAN_RESULTS")) {
  278. EPLog.m86d(SearchWiFiDirectPrinterTask.TAG, "Scan Results Available");
  279. SearchWiFiDirectPrinterTask.this.onScanResultAvailable();
  280. }
  281. }
  282. }
  283. class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
  284. WiFiDirectBroadcastReceiver() {
  285. }
  286. public void onReceive(Context context, Intent intent) {
  287. WifiP2pDeviceList wifiP2pDeviceList;
  288. if (intent.getAction().equals("android.net.wifi.p2p.PEERS_CHANGED") && (wifiP2pDeviceList = (WifiP2pDeviceList) intent.getParcelableExtra("wifiP2pDeviceList")) != null) {
  289. Collection<WifiP2pDevice> deviceList = wifiP2pDeviceList.getDeviceList();
  290. if (deviceList.size() == 0) {
  291. EPLog.m86d(SearchWiFiDirectPrinterTask.TAG, "No devices found");
  292. return;
  293. }
  294. for (WifiP2pDevice next : deviceList) {
  295. if (next.deviceName == null || next.deviceName.trim().isEmpty()) {
  296. EPLog.m90w(SearchWiFiDirectPrinterTask.TAG, "deviceName is empty" + next.deviceAddress);
  297. } else if (!WifiP2pUtils.PrimaryDeviceType.isPrinter(next.primaryDeviceType)) {
  298. EPLog.m88i(SearchWiFiDirectPrinterTask.TAG, "Category Not Printer " + next.deviceName);
  299. } else if (MacAddrFilter.getInstance(context).isExcludedMacAddress(WiFiControl.p2pAddr2PtrAddr(next.deviceAddress, next.deviceName))) {
  300. EPLog.m88i(SearchWiFiDirectPrinterTask.TAG, "Excluded Printer " + next.deviceName);
  301. } else {
  302. SearchWiFiDirectPrinterTask.this.onFindPrinterResult(WiFiControl.addSSIDPrefix(next.deviceName, WiFiControl.ConnectType.WiFiP2P), -1, next.deviceAddress);
  303. }
  304. }
  305. EPLog.m88i(SearchWiFiDirectPrinterTask.TAG, "Continue discover Peers()");
  306. }
  307. }
  308. }
  309. class ScanningObserver {
  310. AsyncTask<Void, Void, Void> observerTask = null;
  311. ScanningObserver() {
  312. }
  313. private void start(final int i) {
  314. interrunpt();
  315. EPLog.m86d(SearchWiFiDirectPrinterTask.TAG, "Start ScanningObserver");
  316. observerTask = new AsyncTask<Void, Void, Void>() {
  317. protected Void doInBackground(Void... voidArr) {
  318. int i = 0;
  319. do {
  320. try {
  321. if (i >= i) {
  322. return null;
  323. }
  324. Thread.sleep(100);
  325. i += 100;
  326. } catch (InterruptedException e) {
  327. e.printStackTrace();
  328. return null;
  329. }
  330. } while (!isCancelled());
  331. return null;
  332. }
  333. protected void onPostExecute(Void voidR) {
  334. EPLog.m88i(SearchWiFiDirectPrinterTask.TAG, "Timeout ScanningObserver");
  335. SearchWiFiDirectPrinterTask.mHandler.sendEmptyMessage(SearchWiFiDirectPrinterTask.this.idResult);
  336. SearchWiFiDirectPrinterTask.this.interrupt();
  337. }
  338. }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Void[0]);
  339. }
  340. private void interrunpt() {
  341. AsyncTask<Void, Void, Void> asyncTask = observerTask;
  342. if (asyncTask != null && asyncTask.getStatus() == AsyncTask.Status.RUNNING && !this.observerTask.isCancelled()) {
  343. EPLog.m86d(SearchWiFiDirectPrinterTask.TAG, "Stop ScanningObserver");
  344. observerTask.cancel(false);
  345. }
  346. }
  347. }
  348. }