WifiP2pUtils.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package com.epson.mobilephone.common.wifidirect;
  2. import android.content.Context;
  3. import android.net.wifi.p2p.WifiP2pDevice;
  4. import android.net.wifi.p2p.WifiP2pGroup;
  5. import android.net.wifi.p2p.WifiP2pManager;
  6. import android.os.Build;
  7. import android.os.HandlerThread;
  8. import java.net.NetworkInterface;
  9. import java.net.SocketException;
  10. import java.util.Locale;
  11. public class WifiP2pUtils {
  12. private static final String TAG = "WifiP2pUtils";
  13. private static final int TIMEOUT_CONNECTIONINFO = 5000;
  14. private static WifiP2pUtils instance;
  15. private volatile WifiP2pGroup groupInfo = null;
  16. private HandlerThread handlerThread = null;
  17. private volatile Object lock = new Object();
  18. private Context mAppContext = null;
  19. private WifiP2pManager mWiFiP2PManager = null;
  20. private WifiP2pManager.Channel p2pChannnel = null;
  21. private volatile STATUS status = STATUS.IDLE;
  22. enum STATUS {
  23. IDLE,
  24. REQUEST_GROUPINFO
  25. }
  26. public class ConnectionInfo {
  27. boolean isGroupOwnerThisDevice;
  28. public String p2PMacAdder;
  29. public String printerName;
  30. public ConnectionInfo() {
  31. }
  32. }
  33. public static WifiP2pUtils getInstance(Context context) {
  34. WifiP2pUtils wifiP2pUtils = instance;
  35. if (wifiP2pUtils != null) {
  36. return wifiP2pUtils;
  37. }
  38. instance = new WifiP2pUtils(context);
  39. return instance;
  40. }
  41. private WifiP2pUtils(Context context) {
  42. if (Build.VERSION.SDK_INT >= 14) {
  43. mAppContext = context.getApplicationContext();
  44. handlerThread = new HandlerThread("Thread for WiFip2p");
  45. handlerThread.start();
  46. mWiFiP2PManager = (WifiP2pManager) mAppContext.getSystemService("wifip2p");
  47. WifiP2pManager wifiP2pManager = mWiFiP2PManager;
  48. if (wifiP2pManager != null) {
  49. p2pChannnel = wifiP2pManager.initialize(mAppContext, handlerThread.getLooper(), (WifiP2pManager.ChannelListener) null);
  50. if (this.p2pChannnel == null) {
  51. mWiFiP2PManager = null;
  52. }
  53. }
  54. }
  55. }
  56. public boolean isConnectedWiFiP2P() {
  57. return getConnectionInfo() != null;
  58. }
  59. public ConnectionInfo getConnectionInfo() {
  60. WifiP2pDevice p2PPrinterInfo;
  61. WifiP2pGroup p2POwnerInfo = getP2POwnerInfo();
  62. if (p2POwnerInfo == null || (p2PPrinterInfo = getP2PPrinterInfo(p2POwnerInfo)) == null) {
  63. return null;
  64. }
  65. ConnectionInfo connectionInfo = new ConnectionInfo();
  66. connectionInfo.isGroupOwnerThisDevice = p2POwnerInfo.isGroupOwner();
  67. connectionInfo.p2PMacAdder = p2PPrinterInfo.deviceAddress;
  68. connectionInfo.printerName = p2PPrinterInfo.deviceName;
  69. return connectionInfo;
  70. }
  71. public WifiP2pDevice getP2PPrinterInfo(WifiP2pGroup wifiP2pGroup) {
  72. if (wifiP2pGroup == null) {
  73. return null;
  74. }
  75. if (!wifiP2pGroup.isGroupOwner() && wifiP2pGroup.getOwner() != null && PrimaryDeviceType.isPrinter(wifiP2pGroup.getOwner().primaryDeviceType)) {
  76. return wifiP2pGroup.getOwner();
  77. }
  78. for (WifiP2pDevice next : wifiP2pGroup.getClientList()) {
  79. if (PrimaryDeviceType.isPrinter(next.primaryDeviceType)) {
  80. return next;
  81. }
  82. }
  83. return null;
  84. }
  85. public NetworkInterface getP2PInterfaceInfo() {
  86. WifiP2pGroup p2POwnerInfo = getP2POwnerInfo();
  87. if (p2POwnerInfo == null) {
  88. return null;
  89. }
  90. try {
  91. return NetworkInterface.getByName(p2POwnerInfo.getInterface());
  92. } catch (SocketException e) {
  93. e.printStackTrace();
  94. return null;
  95. }
  96. }
  97. private WifiP2pGroup getP2POwnerInfo() {
  98. if (mWiFiP2PManager == null) {
  99. return null;
  100. }
  101. groupInfo = null;
  102. synchronized (this.lock) {
  103. status = STATUS.REQUEST_GROUPINFO;
  104. mWiFiP2PManager.requestGroupInfo(this.p2pChannnel, new WifiP2pManager.GroupInfoListener() {
  105. public void onGroupInfoAvailable(WifiP2pGroup wifiP2pGroup) {
  106. WifiP2pGroup unused = WifiP2pUtils.this.groupInfo = wifiP2pGroup;
  107. if (WifiP2pUtils.this.groupInfo != null) {
  108. EPLog.m86d(WifiP2pUtils.TAG, "Received EXTRA_WIFI_P2P_GROUP = " + WifiP2pUtils.this.groupInfo.toString());
  109. } else {
  110. EPLog.m86d(WifiP2pUtils.TAG, "Received EXTRA_WIFI_P2P_GROUP = null");
  111. }
  112. WifiP2pUtils.this.resumeThread();
  113. }
  114. });
  115. try {
  116. lock.wait(5000);
  117. } catch (InterruptedException e) {
  118. e.printStackTrace();
  119. }
  120. status = STATUS.IDLE;
  121. }
  122. return groupInfo;
  123. }
  124. private void resumeThread() {
  125. synchronized (this.lock) {
  126. try {
  127. lock.notifyAll();
  128. } catch (IllegalMonitorStateException e) {
  129. e.printStackTrace();
  130. }
  131. }
  132. }
  133. public void disconnect() {
  134. WifiP2pManager wifiP2pManager = mWiFiP2PManager;
  135. if (wifiP2pManager != null) {
  136. wifiP2pManager.removeGroup(this.p2pChannnel, new WifiP2pManager.ActionListener() {
  137. public void onSuccess() {
  138. EPLog.m86d(WifiP2pUtils.TAG, "Success removeGroup");
  139. }
  140. public void onFailure(int i) {
  141. EPLog.m86d(WifiP2pUtils.TAG, "Failed removeGroup");
  142. }
  143. });
  144. }
  145. }
  146. public static class PrimaryDeviceType {
  147. private static final String DEMIRITA_WIFI_OUI = "0050F204";
  148. public static final int P2P_CATEGORY_PRINTER = 3;
  149. public static final int P2P_SUBCATEGORY_MFP = 5;
  150. public static final int P2P_SUBCATEGORY_PRINTER = 1;
  151. private int categoryId = 0;
  152. private int subCategoryId = 0;
  153. public static boolean isPrinter(String str) {
  154. PrimaryDeviceType parsePrimaryDeviceType = parsePrimaryDeviceType(str);
  155. if (parsePrimaryDeviceType == null || 3 != parsePrimaryDeviceType.categoryId) {
  156. return false;
  157. }
  158. int i = parsePrimaryDeviceType.subCategoryId;
  159. if (1 == i || 5 == i) {
  160. return true;
  161. }
  162. return false;
  163. }
  164. private static PrimaryDeviceType parsePrimaryDeviceType(String str) {
  165. PrimaryDeviceType primaryDeviceType = new PrimaryDeviceType();
  166. primaryDeviceType.categoryId = 0;
  167. primaryDeviceType.subCategoryId = 0;
  168. if (str == null || str.isEmpty()) {
  169. return primaryDeviceType;
  170. }
  171. str.toUpperCase(Locale.ENGLISH);
  172. String replaceAll = str.replaceAll("[^(0-9)^(A-Z)]", "");
  173. int indexOf = replaceAll.indexOf(DEMIRITA_WIFI_OUI);
  174. if (indexOf < 0) {
  175. return primaryDeviceType;
  176. }
  177. String substring = replaceAll.substring(0, indexOf);
  178. String substring2 = replaceAll.substring(indexOf + 8);
  179. try {
  180. primaryDeviceType.categoryId = Integer.parseInt(substring, 16);
  181. primaryDeviceType.subCategoryId = Integer.parseInt(substring2, 16);
  182. } catch (NumberFormatException e) {
  183. e.printStackTrace();
  184. }
  185. return primaryDeviceType;
  186. }
  187. }
  188. }