ActivityiPrintConnect.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  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.content.res.Resources;
  7. import android.net.wifi.ScanResult;
  8. import android.net.wifi.WifiManager;
  9. import android.os.AsyncTask;
  10. import android.os.Bundle;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.widget.Button;
  14. import android.widget.ProgressBar;
  15. import android.widget.TextView;
  16. import com.epson.mobilephone.common.wifidirect.escprLib;
  17. import java.io.ByteArrayOutputStream;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Random;
  21. public class ActivityiPrintConnect extends ActivityWiFiDirectBase {
  22. public static final String FINISH_EAYSETUP = "easysetup";
  23. private static final int MACADRESS_SIZE = 6;
  24. private static final int MAX_RETRY = 5;
  25. private static final int RUNDOM_SIZE = 4;
  26. private static final String TAG = "ActivityiPrintConnect";
  27. private static final int TIMEOUT_CONNECTING_REALAP = 60;
  28. private static final int TIMEOUT_CONNECTING_TESTAP = 60;
  29. private static final int WAIT_CONNECTREALAP = 120;
  30. private static final int WAIT_RETRY = 2;
  31. private static byte[] engineId;
  32. private final int CONNECT_REALAP = 2;
  33. private final int CONNECT_TESTAP = 1;
  34. Button btnFinish;
  35. Intent intentResult = null;
  36. boolean isKeepSimpleAPConnection = false;
  37. String lastErrorStrings = "";
  38. escprLib mEscprLib = new escprLib();
  39. WifiManager mWifiManager = null;
  40. NetworkStateChangeReciever networkStateChangeReciever = null;
  41. ProgressBar progress;
  42. escprLib.ConnectStrings settingsRealAp = new escprLib.ConnectStrings();
  43. escprLib.ConnectStrings settingsTempAp = new escprLib.ConnectStrings();
  44. private Status status = Status.IDLE;
  45. AsyncTask<Void, Void, Boolean> taskGetConnectStrings = null;
  46. TextView textView1;
  47. TextView textView2;
  48. TextView textView3;
  49. ViewGroup toolbar;
  50. Object waitRealAp = new Object();
  51. WiFiUtils wiFiUtils = null;
  52. enum Status {
  53. IDLE,
  54. CONNECTING_TEMPAP,
  55. GETTING_GONNECTSTRINGS,
  56. CONNECTING_REALAP,
  57. CONNECTED,
  58. CONNECTED_OTHERAP,
  59. CONNECT_ERROR
  60. }
  61. protected void onCreate(Bundle bundle) {
  62. super.onCreate(bundle);
  63. mWifiManager = (WifiManager) getApplicationContext().getSystemService(Service.WIFI_SERVICE);
  64. wiFiUtils = WiFiUtils.getInstance(this);
  65. if (engineId == null) {
  66. engineId = getEngineId();
  67. }
  68. ViewGroup viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.iprintconnect, (ViewGroup) null);
  69. setContentView((View) viewGroup);
  70. setupCommonHeaderControl(false, false);
  71. toolbar = (ViewGroup) viewGroup.findViewById(R.id.toolbar);
  72. btnFinish = (Button) viewGroup.findViewById(R.id.btn_finish);
  73. textView1 = (TextView) viewGroup.findViewById(R.id.textView1);
  74. textView2 = (TextView) viewGroup.findViewById(R.id.textView2);
  75. textView3 = (TextView) viewGroup.findViewById(R.id.textView3);
  76. progress = (ProgressBar) viewGroup.findViewById(R.id.progressBarGetConnectStrings);
  77. btnFinish.setOnClickListener(new View.OnClickListener() {
  78. public void onClick(View view) {
  79. ActivityiPrintConnect.this.onFinishPressed();
  80. }
  81. });
  82. mEscprLib.epsWrapperGetSetupConnectStrings(this.settingsTempAp);
  83. }
  84. public void onFinishPressed() {
  85. Intent intent = intentResult;
  86. if (intent != null) {
  87. setResult(-1, intent);
  88. isKeepSimpleAPConnection = true;
  89. } else {
  90. setResult(0);
  91. }
  92. finish();
  93. }
  94. public void onCancelPressed() {
  95. super.onCancelPressed();
  96. disconnectRealAp();
  97. }
  98. private void disconnectRealAp() {
  99. status = Status.CONNECT_ERROR;
  100. WiFiUtils wiFiUtils2 = wiFiUtils;
  101. wiFiUtils2.removeSimpleAP(wiFiUtils2.getNetworkId(this.settingsRealAp.ssid));
  102. }
  103. protected void onResume() {
  104. super.onResume();
  105. isKeepSimpleAPConnection = false;
  106. switch (this.status) {
  107. case IDLE:
  108. setDisplayMenu(false);
  109. toolbar.setVisibility(View.GONE);
  110. status = Status.CONNECTING_TEMPAP;
  111. startConnectTempAp();
  112. return;
  113. case CONNECTED:
  114. onConnectSimpleAP();
  115. return;
  116. case CONNECTED_OTHERAP:
  117. onConnectOtherAP();
  118. return;
  119. case CONNECT_ERROR:
  120. onConnectError();
  121. return;
  122. default:
  123. return;
  124. }
  125. }
  126. protected void onPause() {
  127. EPLog.m86d(TAG, "onPause()");
  128. super.onPause();
  129. if (this.status == Status.GETTING_GONNECTSTRINGS) {
  130. EPLog.m86d(TAG, "interruputGetConnectSttings()");
  131. status = Status.CONNECT_ERROR;
  132. AsyncTask<Void, Void, Boolean> asyncTask = taskGetConnectStrings;
  133. if (asyncTask != null) {
  134. asyncTask.cancel(true);
  135. taskGetConnectStrings = null;
  136. }
  137. }
  138. WiFiUtils wiFiUtils2 = wiFiUtils;
  139. wiFiUtils2.removeSimpleAP(wiFiUtils2.getNetworkId(this.settingsTempAp.ssid));
  140. if (!this.isKeepSimpleAPConnection && settingsRealAp.ssid != null) {
  141. disconnectRealAp();
  142. }
  143. }
  144. private void registBroadcastReciever() {
  145. if (this.networkStateChangeReciever == null) {
  146. networkStateChangeReciever = new NetworkStateChangeReciever();
  147. registerReceiver(this.networkStateChangeReciever, new IntentFilter("android.net.wifi.SCAN_RESULTS"));
  148. }
  149. }
  150. private void unRegistBroadcastReciever() {
  151. NetworkStateChangeReciever networkStateChangeReciever2 = networkStateChangeReciever;
  152. if (networkStateChangeReciever2 != null) {
  153. unregisterReceiver(networkStateChangeReciever2);
  154. networkStateChangeReciever = null;
  155. }
  156. }
  157. protected void onActivityResult(int i, int i2, Intent intent) {
  158. super.onActivityResult(i, i2, intent);
  159. String ssid = wiFiUtils.getSSID(this.wiFiUtils.getCurNetworkId());
  160. switch (i) {
  161. case 1:
  162. if (i2 != -1) {
  163. status = Status.CONNECT_ERROR;
  164. return;
  165. } else if (this.settingsTempAp.ssid.equals(ssid)) {
  166. startConnectRealAp();
  167. return;
  168. } else if (ssid != null) {
  169. status = Status.CONNECTED_OTHERAP;
  170. return;
  171. } else {
  172. status = Status.CONNECT_ERROR;
  173. return;
  174. }
  175. case 2:
  176. if (i2 != -1) {
  177. status = Status.CONNECT_ERROR;
  178. return;
  179. } else if (this.settingsRealAp.ssid.equals(ssid)) {
  180. intentResult = intent;
  181. intentResult.putExtra(FINISH_EAYSETUP, true);
  182. status = Status.CONNECTED;
  183. return;
  184. } else if (ssid != null) {
  185. status = Status.CONNECTED_OTHERAP;
  186. return;
  187. } else {
  188. status = Status.CONNECT_ERROR;
  189. return;
  190. }
  191. default:
  192. return;
  193. }
  194. }
  195. private void onConnectSimpleAP() {
  196. EPLog.m86d(TAG, "onConnectSimpleAP()");
  197. toolbar.setVisibility(View.VISIBLE);
  198. progress.setVisibility(View.GONE);
  199. setDisplayMenu(true);
  200. textView1.setText(getResources().getString(R.string.str_connected_printer1));
  201. TextView textView = textView2;
  202. Resources resources = getResources();
  203. WiFiUtils wiFiUtils2 = wiFiUtils;
  204. textView.setText(resources.getString(R.string.str_connected_printer2, new Object[]{this.intentResult.getStringExtra("name"), wiFiUtils2.getSSID(wiFiUtils2.getCurNetworkId())}));
  205. textView3.setText(getResources().getString(R.string.str_connected_printer3));
  206. }
  207. private void onConnectOtherAP() {
  208. EPLog.m86d(TAG, "onConnectOtherAP()");
  209. toolbar.setVisibility(View.GONE);
  210. progress.setVisibility(View.GONE);
  211. setDisplayMenu(true);
  212. textView1.setText(getResources().getString(R.string.str_connected_otherAP1));
  213. textView2.setText(getResources().getString(R.string.str_connected_otherAP2));
  214. textView3.setText(getResources().getString(R.string.str_connected_otherAP3));
  215. }
  216. private void onConnectError() {
  217. EPLog.m86d(TAG, "onConnectError()");
  218. toolbar.setVisibility(View.GONE);
  219. progress.setVisibility(View.GONE);
  220. setDisplayMenu(true);
  221. textView1.setText(getResources().getString(R.string.str_connect_error1));
  222. textView2.setText(getResources().getString(R.string.str_connect_error2));
  223. textView3.setText(getResources().getString(R.string.str_connect_error3));
  224. }
  225. private void startConnectTempAp() {
  226. EPLog.m86d(TAG, "startConnectTempAp()");
  227. Intent intent = new Intent(this, ActivityConnectSimpleAP.class);
  228. intent.putExtra(ActivityConnectBase.APNAME, settingsTempAp.ssid);
  229. intent.putExtra(ActivityConnectBase.APPASS, settingsTempAp.password);
  230. intent.putExtra(ActivityConnectBase.CREATE, true);
  231. intent.putExtra(ActivityConnectBase.SHOWERROR, false);
  232. intent.putExtra(ActivityConnectBase.SHOWTIP, false);
  233. intent.putExtra(ActivityConnectBase.TIMEOUT, 60);
  234. intent.putExtra(ActivityConnectBase.NEEDINFO, false);
  235. startActivityForResult(intent, 1);
  236. }
  237. private void startConnectRealAp() {
  238. EPLog.m86d(TAG, "startConnectRealAp()");
  239. taskGetConnectStrings = new AsyncTask<Void, Void, Boolean>() {
  240. protected void onPreExecute() {
  241. ActivityiPrintConnect.this.getWindow().addFlags(128);
  242. Status unused = ActivityiPrintConnect.this.status = Status.GETTING_GONNECTSTRINGS;
  243. }
  244. protected Boolean doInBackground(Void... voidArr) {
  245. ActivityiPrintConnect.this.wiFiUtils.pingWiFiDirectPrinter();
  246. ActivityiPrintConnect.mEscprLib.epsWrapperInitDriver(192);
  247. boolean z = false;
  248. int i = -1;
  249. int i2 = 0;
  250. int i3 = -1;
  251. while (i2 < 5) {
  252. try {
  253. if (!isCancelled()) {
  254. i3 = ActivityiPrintConnect.mEscprLib.epsWrapperGetConnectStrings(ActivityiPrintConnect.engineId, ActivityiPrintConnect.this.settingsRealAp);
  255. if (!isCancelled()) {
  256. if (i3 == 0) {
  257. break;
  258. }
  259. i2++;
  260. EPLog.m88i(ActivityiPrintConnect.TAG, "epsWrapperGetConnectStrings ret = " + i3 + " retry = " + i2);
  261. Thread.sleep(2000);
  262. } else {
  263. throw new InterruptedException();
  264. }
  265. } else {
  266. throw new InterruptedException();
  267. }
  268. } catch (InterruptedException e) {
  269. e.printStackTrace();
  270. }
  271. }
  272. if (i3 == 0) {
  273. EPLog.m86d(ActivityiPrintConnect.TAG, "epsWrapperGetConnectStrings ssid = " + ActivityiPrintConnect.this.settingsRealAp.ssid + " printerId = " + ActivityiPrintConnect.this.settingsRealAp.printerId);
  274. ActivityiPrintConnect.mEscprLib.epsWrapperStartWifiDirect(ActivityiPrintConnect.this.settingsRealAp.printerIp.toCharArray());
  275. synchronized (ActivityiPrintConnect.this.waitRealAp) {
  276. ActivityiPrintConnect.this.registBroadcastReciever();
  277. ActivityiPrintConnect.mWifiManager.startScan();
  278. long currentTimeMillis = System.currentTimeMillis();
  279. ActivityiPrintConnect.this.waitRealAp.wait(120000);
  280. if (System.currentTimeMillis() - currentTimeMillis >= 120000) {
  281. EPLog.m87e(ActivityiPrintConnect.TAG, "Find RealAp Timepout");
  282. i3 = -1;
  283. }
  284. }
  285. } else {
  286. EPLog.m87e(ActivityiPrintConnect.TAG, "epsWrapperGetConnectStrings ret = " + i3);
  287. ActivityiPrintConnect activityiPrintConnect = ActivityiPrintConnect.this;
  288. activityiPrintConnect.lastErrorStrings = "epsWrapperGetConnectStrings ret = " + i3;
  289. }
  290. ActivityiPrintConnect.this.wiFiUtils.removeSimpleAP(ActivityiPrintConnect.this.wiFiUtils.getNetworkId(ActivityiPrintConnect.this.settingsTempAp.ssid));
  291. i = i3;
  292. ActivityiPrintConnect.this.unRegistBroadcastReciever();
  293. ActivityiPrintConnect.mEscprLib.epsWrapperReleaseDriver();
  294. if (i == 0) {
  295. z = true;
  296. }
  297. return Boolean.valueOf(z);
  298. }
  299. protected void onPostExecute(Boolean bool) {
  300. ActivityiPrintConnect.this.getWindow().clearFlags(128);
  301. if (bool.booleanValue()) {
  302. Status unused = ActivityiPrintConnect.this.status = Status.CONNECTING_REALAP;
  303. Intent intent = new Intent(ActivityiPrintConnect.this, ActivityConnectSimpleAP.class);
  304. intent.putExtra(ActivityConnectBase.APNAME, ActivityiPrintConnect.this.settingsRealAp.ssid);
  305. intent.putExtra(ActivityConnectBase.APPASS, ActivityiPrintConnect.this.settingsRealAp.password);
  306. intent.putExtra(ActivityConnectBase.CREATE, true);
  307. intent.putExtra(ActivityConnectBase.SHOWERROR, false);
  308. intent.putExtra(ActivityConnectBase.SHOWTIP, false);
  309. intent.putExtra(ActivityConnectBase.TIMEOUT, 60);
  310. intent.putExtra(ActivityConnectBase.NEEDINFO, true);
  311. ActivityiPrintConnect.this.startActivityForResult(intent, 2);
  312. return;
  313. }
  314. Status unused2 = ActivityiPrintConnect.this.status = Status.CONNECT_ERROR;
  315. ActivityiPrintConnect.this.onConnectError();
  316. }
  317. protected void onCancelled() {
  318. EPLog.m86d(ActivityiPrintConnect.TAG, "taskGetConnectStrings Canceled");
  319. Status unused = ActivityiPrintConnect.this.status = Status.CONNECT_ERROR;
  320. ActivityiPrintConnect.this.getWindow().clearFlags(128);
  321. ActivityiPrintConnect.this.wiFiUtils.removeSimpleAP(ActivityiPrintConnect.this.wiFiUtils.getNetworkId(ActivityiPrintConnect.this.settingsTempAp.ssid));
  322. super.onCancelled();
  323. }
  324. }.execute(new Void[0]);
  325. }
  326. private byte[] getEngineId() {
  327. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(10);
  328. Random random = new Random();
  329. for (int i = 0; i < 4; i++) {
  330. byteArrayOutputStream.write(random.nextInt());
  331. }
  332. String macAddress = mWifiManager.getConnectionInfo().getMacAddress();
  333. if (macAddress != null) {
  334. EPLog.m86d(TAG, "getEngineId macAdress = " + macAddress);
  335. String[] split = macAddress.split(":", 6);
  336. if (split.length == 6) {
  337. for (int i2 = 0; i2 < 6; i2++) {
  338. byteArrayOutputStream.write((byte) Integer.parseInt(split[i2], 16));
  339. }
  340. }
  341. } else {
  342. byteArrayOutputStream.write(new byte[]{0, 0, 0, 0, 0, 0}, 0, 6);
  343. }
  344. return byteArrayOutputStream.toByteArray();
  345. }
  346. private void onScanResultAvailable() {
  347. List<ScanResult> arrayList = new ArrayList<>();
  348. try {
  349. arrayList = mWifiManager.getScanResults();
  350. } catch (SecurityException e) {
  351. e.printStackTrace();
  352. }
  353. if (arrayList.size() != 0) {
  354. for (ScanResult scanResult : arrayList) {
  355. if (this.settingsRealAp.ssid.equals(WiFiUtils.removeQuotationsInSSID(scanResult.SSID))) {
  356. EPLog.m86d(TAG, "Found AP");
  357. synchronized (this.waitRealAp) {
  358. waitRealAp.notify();
  359. }
  360. return;
  361. }
  362. }
  363. }
  364. new WiFiScanner().startScan(mWifiManager);
  365. }
  366. class NetworkStateChangeReciever extends BroadcastReceiver {
  367. NetworkStateChangeReciever() {
  368. }
  369. public void onReceive(Context context, Intent intent) {
  370. if (intent.getAction().equals("android.net.wifi.SCAN_RESULTS")) {
  371. EPLog.m86d(ActivityiPrintConnect.TAG, "Scan Results Available");
  372. ActivityiPrintConnect.this.onScanResultAvailable();
  373. }
  374. }
  375. }
  376. }