ManageDefaultNetwork.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. package com.epson.mobilephone.common.wifidirect;
  2. import android.annotation.TargetApi;
  3. import android.app.Service;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.net.ConnectivityManager;
  7. import android.net.Network;
  8. import android.net.NetworkCapabilities;
  9. import android.net.NetworkRequest;
  10. import android.net.Uri;
  11. import android.net.wifi.WifiManager;
  12. import android.os.Build;
  13. import android.provider.Settings;
  14. import com.google.api.client.http.HttpMethods;
  15. import com.google.common.net.HttpHeaders;
  16. import org.opencv.videoio.Videoio;
  17. import java.io.IOException;
  18. import java.net.HttpURLConnection;
  19. import java.net.URL;
  20. @TargetApi(21)
  21. public class ManageDefaultNetwork {
  22. private static final String CHECKURL = "http://epson.com";
  23. private static final String TAG = "ManageDefaultNetwork";
  24. private static final int TIMEOUT_CHECKURL = 5000;
  25. private static ManageDefaultNetwork manageDefaultNetwork;
  26. volatile boolean canConnected = false;
  27. private String checkedSSID = null;
  28. private ConnectivityManager connectivityManager = null;
  29. private boolean isOnline = false;
  30. private volatile Object lock = new Object();
  31. private Context mContext = null;
  32. private ManageDefaultNetworkCallback manageDefaultNetworkCallback = null;
  33. private WifiManager wifiManager = null;
  34. private ManageDefaultNetwork(Context context) {
  35. mContext = context.getApplicationContext();
  36. connectivityManager = (ConnectivityManager) mContext.getSystemService(Service.CONNECTIVITY_SERVICE);
  37. wifiManager = (WifiManager) mContext.getSystemService(Service.WIFI_SERVICE);
  38. }
  39. public static ManageDefaultNetwork getInstance(Context context) {
  40. ManageDefaultNetwork manageDefaultNetwork2 = manageDefaultNetwork;
  41. if (manageDefaultNetwork2 != null) {
  42. return manageDefaultNetwork2;
  43. }
  44. manageDefaultNetwork = new ManageDefaultNetwork(context);
  45. return manageDefaultNetwork;
  46. }
  47. private synchronized boolean checkCurSSIDisOnline(String str) {
  48. boolean z;
  49. Network activeNetwork;
  50. NetworkCapabilities networkCapabilities;
  51. canConnected = false;
  52. if (WiFiControl.isSimpleAP(str)) {
  53. return false;
  54. }
  55. if (Build.VERSION.SDK_INT < 23 || (activeNetwork = connectivityManager.getActiveNetwork()) == null || (networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork)) == null || !networkCapabilities.hasTransport(0)) {
  56. synchronized (lock) {
  57. EPLog.d(TAG, "Checking whether isOnline : " + str);
  58. new Thread(new Runnable() {
  59. public void run() {
  60. try {
  61. HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(ManageDefaultNetwork.CHECKURL).openConnection();
  62. httpURLConnection.setRequestMethod(HttpMethods.HEAD);
  63. httpURLConnection.setUseCaches(false);
  64. httpURLConnection.setRequestProperty(HttpHeaders.CONNECTION, "close");
  65. httpURLConnection.setConnectTimeout(5000);
  66. httpURLConnection.connect();
  67. int responseCode = httpURLConnection.getResponseCode();
  68. EPLog.d(ManageDefaultNetwork.TAG, "getResponseCode() : " + responseCode);
  69. httpURLConnection.disconnect();
  70. if (responseCode > 0) {
  71. canConnected = true;
  72. }
  73. } catch (IOException unused) {
  74. EPLog.e(ManageDefaultNetwork.TAG, "HttpURLConnection failed");
  75. canConnected = false;
  76. }
  77. synchronized (lock) {
  78. try {
  79. lock.notifyAll();
  80. } catch (IllegalMonitorStateException e) {
  81. e.printStackTrace();
  82. }
  83. }
  84. }
  85. }).start();
  86. try {
  87. lock.wait(10000);
  88. } catch (InterruptedException e) {
  89. e.printStackTrace();
  90. }
  91. z = canConnected;
  92. }
  93. return z;
  94. }
  95. EPLog.d(TAG, "WiFi connected, But default network is cellular. " + str + "is offline.");
  96. return false;
  97. }
  98. public synchronized void setDefaultNetworkSimpleAp() {
  99. if (Build.VERSION.SDK_INT >= 21) {
  100. String curSSID = WiFiUtils.getInstance(mContext).getCurSSID();
  101. if (curSSID == null) {
  102. EPLog.d(TAG, "Not connected");
  103. return;
  104. }
  105. if (!curSSID.equals(checkedSSID)) {
  106. checkedSSID = curSSID;
  107. isOnline = checkCurSSIDisOnline(curSSID);
  108. if (isOnline) {
  109. EPLog.d(TAG, curSSID + "is online.");
  110. return;
  111. }
  112. } else if (isOnline) {
  113. EPLog.d(TAG, curSSID + "is online.");
  114. return;
  115. }
  116. if (Build.VERSION.SDK_INT >= 23) {
  117. if (connectivityManager.getBoundNetworkForProcess() != null) {
  118. EPLog.d(TAG, "Already bindProcessToNetwork called");
  119. return;
  120. }
  121. } else if (Build.VERSION.SDK_INT >= 21) {
  122. ConnectivityManager connectivityManager2 = connectivityManager;
  123. if (ConnectivityManager.getProcessDefaultNetwork() != null) {
  124. EPLog.d(TAG, "Already setProcessDefaultNetwork called");
  125. return;
  126. }
  127. } else {
  128. return;
  129. }
  130. NetworkRequest.Builder builder = new NetworkRequest.Builder();
  131. builder.removeCapability(12);
  132. builder.addTransportType(1);
  133. try {
  134. if (manageDefaultNetworkCallback == null) {
  135. manageDefaultNetworkCallback = new ManageDefaultNetworkCallback();
  136. }
  137. connectivityManager.requestNetwork(builder.build(), manageDefaultNetworkCallback);
  138. } catch (SecurityException e) {
  139. e.printStackTrace();
  140. if (Build.VERSION.SDK_INT >= 23) {
  141. try {
  142. if (!Settings.System.canWrite(mContext)) {
  143. Intent intent = new Intent("android.settings.action.MANAGE_WRITE_SETTINGS");
  144. intent.setFlags(Videoio.CAP_INTELPERC_IMAGE_GENERATOR);
  145. intent.setData(Uri.parse("package:" + mContext.getPackageName()));
  146. mContext.startActivity(intent);
  147. return;
  148. }
  149. } catch (Exception e2) {
  150. e2.printStackTrace();
  151. }
  152. }
  153. } catch (Exception e3) {
  154. e3.printStackTrace();
  155. }
  156. } else {
  157. return;
  158. }
  159. return;
  160. }
  161. public synchronized void resetDefaultNetwork() {
  162. if (Build.VERSION.SDK_INT >= 23) {
  163. if (connectivityManager.getBoundNetworkForProcess() != null) {
  164. EPLog.d(TAG, "resetProcessDefaultNetwork");
  165. connectivityManager.bindProcessToNetwork((Network) null);
  166. }
  167. } else if (Build.VERSION.SDK_INT >= 21) {
  168. ConnectivityManager connectivityManager2 = connectivityManager;
  169. if (ConnectivityManager.getProcessDefaultNetwork() != null) {
  170. EPLog.d(TAG, "resetProcessDefaultNetwork");
  171. ConnectivityManager connectivityManager3 = connectivityManager;
  172. ConnectivityManager.setProcessDefaultNetwork((Network) null);
  173. }
  174. } else {
  175. return;
  176. }
  177. try {
  178. if (manageDefaultNetworkCallback != null) {
  179. connectivityManager.unregisterNetworkCallback(manageDefaultNetworkCallback);
  180. manageDefaultNetworkCallback = null;
  181. }
  182. } catch (IllegalArgumentException e) {
  183. e.printStackTrace();
  184. } catch (Exception e2) {
  185. e2.printStackTrace();
  186. }
  187. }
  188. class ManageDefaultNetworkCallback extends ConnectivityManager.NetworkCallback {
  189. ManageDefaultNetworkCallback() {
  190. }
  191. public void onAvailable(Network network) {
  192. EPLog.d(ManageDefaultNetwork.TAG, "Call onAvailable");
  193. super.onAvailable(network);
  194. if (Build.VERSION.SDK_INT < 23) {
  195. ConnectivityManager unused = connectivityManager;
  196. if (ConnectivityManager.getProcessDefaultNetwork() == null) {
  197. ConnectivityManager unused2 = connectivityManager;
  198. if (ConnectivityManager.setProcessDefaultNetwork(network)) {
  199. EPLog.d(ManageDefaultNetwork.TAG, "setProcessDefaultNetwork");
  200. }
  201. }
  202. } else if (connectivityManager.getBoundNetworkForProcess() == null && connectivityManager.bindProcessToNetwork(network)) {
  203. EPLog.d(ManageDefaultNetwork.TAG, "bindProcessToNetwork");
  204. }
  205. }
  206. public void onLost(Network network) {
  207. EPLog.d(ManageDefaultNetwork.TAG, "Call onLost");
  208. super.onLost(network);
  209. resetDefaultNetwork();
  210. }
  211. }
  212. }