371b022b2004c3d296022ff413841feb2dabc66f.svn-base 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. package eVVM.apk.ui.vaccination;
  2. import android.animation.Animator;
  3. import android.animation.AnimatorSet;
  4. import android.animation.ObjectAnimator;
  5. import android.app.Dialog;
  6. import android.content.Intent;
  7. import android.content.res.Resources;
  8. import android.nfc.NdefMessage;
  9. import android.nfc.NdefRecord;
  10. import android.nfc.NfcAdapter;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.os.Parcelable;
  14. import android.util.DisplayMetrics;
  15. import android.util.Log;
  16. import android.view.View;
  17. import android.view.animation.AlphaAnimation;
  18. import android.view.animation.Animation;
  19. import android.view.animation.CycleInterpolator;
  20. import android.view.animation.DecelerateInterpolator;
  21. import android.view.animation.LinearInterpolator;
  22. import android.view.animation.RotateAnimation;
  23. import android.widget.ImageView;
  24. import android.widget.ProgressBar;
  25. import android.widget.RelativeLayout;
  26. import com.hjq.base.BaseDialog;
  27. import com.hjq.base.BaseDialogFragment;
  28. import com.hjq.dialog.MessageDialog;
  29. import java.util.ArrayList;
  30. import java.util.Arrays;
  31. import java.util.LinkedList;
  32. import butterknife.BindView;
  33. import butterknife.OnClick;
  34. import eVVM.apk.R;
  35. import eVVM.apk.helper.ConversionUtil;
  36. import eVVM.apk.helper.SPUtils;
  37. import eVVM.apk.helper.SoundPoolHelper;
  38. import eVVM.apk.ui.bean.VnDetailBean;
  39. import eVVM.apk.ui.home.BaseNfcActivity;
  40. import eVVM.apk.ui.home.uploadChip.UploadChipContract;
  41. import eVVM.apk.ui.vaccination.save.ChipModel;
  42. public class ReadingActivity extends BaseNfcActivity implements UploadChipContract.View {
  43. private boolean isWarning = false;
  44. private ChipModel chipModel;
  45. private SoundPoolHelper soundPoolHelper;
  46. private String textRecord = "";
  47. private String chipNumber = "";
  48. @BindView(R.id.reading__line)
  49. ImageView imgreadline;
  50. @BindView(R.id.reading_progress)
  51. ProgressBar readingProgress;
  52. @BindView(R.id.fly_phonerl)
  53. RelativeLayout flyphonerl;
  54. private Animation animation;
  55. private AlphaAnimation alp;
  56. private AnimatorSet animatorSetsuofang;
  57. private AnimatorSet animatorSetsuofang2;
  58. private BaseDialog loadDiago;
  59. private ProgressBar readpb;
  60. @Override
  61. protected int getLayoutId() {
  62. return R.layout.activity_reading;
  63. }
  64. @Override
  65. protected int getTitleId() {
  66. return R.id.reading_title;
  67. }
  68. @Override
  69. protected void initView() {
  70. getAnimationSao(); //进行雷达扫描动画
  71. soundPoolHelper = new SoundPoolHelper(4, SoundPoolHelper.TYPE_MUSIC)
  72. .setRingtoneType(SoundPoolHelper.RING_TYPE_MUSIC)
  73. .loadDefault(ReadingActivity.this)
  74. .load(ReadingActivity.this, "factory_operator_success", R.raw.factory_operator_success)
  75. .load(ReadingActivity.this, "factory_operator_error", R.raw.factory_operator_error)
  76. .load(ReadingActivity.this, "xufuhe", R.raw.xufuhe)
  77. .load(ReadingActivity.this, "zhengchang", R.raw.zhengchang);
  78. //第一次加载才会做飞出动画
  79. int flyPhoneType = (int) SPUtils.get("FlyPhoneType", 0);
  80. if (flyPhoneType == 0) {
  81. getFlyPhone();
  82. SPUtils.put("FlyPhoneType", 1);
  83. } else {
  84. flyphonerl.setVisibility(View.GONE);
  85. }
  86. }
  87. private void getFlyPhone() {
  88. Resources resources = this.getResources();
  89. DisplayMetrics dm = resources.getDisplayMetrics();
  90. int height3 = dm.heightPixels;
  91. //组合动画
  92. animatorSetsuofang = new AnimatorSet();
  93. // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
  94. ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", height3, flyphonerl.getY());
  95. animatorSetsuofang.setDuration(650);
  96. animatorSetsuofang.setInterpolator(new DecelerateInterpolator());
  97. animatorSetsuofang.play(scaleY);
  98. animatorSetsuofang.start();
  99. animatorSetsuofang.addListener(new Animator.AnimatorListener() {
  100. @Override
  101. public void onAnimationStart(Animator animation) {
  102. }
  103. @Override
  104. public void onAnimationEnd(Animator animation) {
  105. postDelayed(new Runnable() {
  106. @Override
  107. public void run() {
  108. //flyphonerl.setVisibility(View.GONE);
  109. animatorSetsuofang.cancel();
  110. getFlyGoBack();
  111. }
  112. }, 5000);
  113. }
  114. @Override
  115. public void onAnimationCancel(Animator animation) {
  116. }
  117. @Override
  118. public void onAnimationRepeat(Animator animation) {
  119. }
  120. });
  121. }
  122. private void getFlyGoBack() {
  123. Resources resources = this.getResources();
  124. DisplayMetrics dm = resources.getDisplayMetrics();
  125. int height3 = dm.heightPixels;
  126. //组合动画
  127. animatorSetsuofang2 = new AnimatorSet();
  128. // ObjectAnimator scaleX = ObjectAnimator.ofFloat(scohhh, "translationX", 1.5f, 1f);
  129. ObjectAnimator scaleY = ObjectAnimator.ofFloat(flyphonerl, "translationY", 0, height3);
  130. animatorSetsuofang2.setDuration(1500);
  131. animatorSetsuofang2.setInterpolator(new DecelerateInterpolator());
  132. animatorSetsuofang2.play(scaleY);
  133. animatorSetsuofang2.start();
  134. animatorSetsuofang2.addListener(new Animator.AnimatorListener() {
  135. @Override
  136. public void onAnimationStart(Animator animation) {
  137. }
  138. @Override
  139. public void onAnimationEnd(Animator animation) {
  140. flyphonerl.setVisibility(View.GONE);
  141. animatorSetsuofang2.cancel();
  142. }
  143. @Override
  144. public void onAnimationCancel(Animator animation) {
  145. }
  146. @Override
  147. public void onAnimationRepeat(Animator animation) {
  148. }
  149. });
  150. }
  151. private void getAnimationSao() {
  152. animation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  153. animation.setFillAfter(true);
  154. animation.setDuration(2000); //两秒转一圈
  155. animation.setInterpolator(new LinearInterpolator());
  156. animation.setRepeatCount(Animation.INFINITE); //循环执行
  157. imgreadline.startAnimation(animation);
  158. int[] antenna = new int[]{R.id.reading_antenna1, R.id.reading_antenna2, R.id.reading_antenna3, R.id.reading_antenna4, R.id.reading_antenna5, R.id.reading_antenna6,
  159. R.id.reading_antenna7, R.id.reading_antenna8, R.id.reading_antenna9};
  160. int nfcWireIndex = 2;
  161. try {
  162. nfcWireIndex = Integer.parseInt(String.valueOf(SPUtils.get("PHONE_MODEL", "2")));
  163. } catch (Exception e) {
  164. e.printStackTrace();
  165. }
  166. alp = new AlphaAnimation(1, 0.2f);
  167. alp.setStartOffset(500);
  168. alp.setDuration(1000);
  169. alp.setFillAfter(false);
  170. alp.setInterpolator(new CycleInterpolator(2));
  171. alp.setRepeatCount(Animation.INFINITE);
  172. findViewById(antenna[nfcWireIndex - 1]).setAnimation(alp);
  173. alp.start();
  174. }
  175. @OnClick({R.id.again_bt})
  176. public void onViewClicked(View view) {
  177. switch (view.getId()) {
  178. case R.id.again_bt:
  179. startActivityFinish(QrCodeActivity.class);
  180. break;
  181. }
  182. }
  183. @Override
  184. protected void initData() {
  185. mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
  186. }
  187. /**
  188. * 读取NFC标签文本数据
  189. */
  190. private String readNfcTag(Intent intent) {
  191. readingProgress.setProgress(0);
  192. if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
  193. Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
  194. NdefMessage msgs[] = null;
  195. if (rawMsgs != null) {
  196. msgs = new NdefMessage[rawMsgs.length];
  197. for (int i = 0; i < rawMsgs.length; i++) {
  198. msgs[i] = (NdefMessage) rawMsgs[i];
  199. }
  200. }
  201. try {
  202. if (msgs != null) {
  203. NdefRecord record = msgs[0].getRecords()[0];
  204. return parseTextRecord(record);
  205. }
  206. } catch (Exception e) {
  207. }
  208. }
  209. return null;
  210. }
  211. public String parseTextRecord(NdefRecord ndefRecord) {
  212. if (ndefRecord.getTnf() != NdefRecord.TNF_WELL_KNOWN) {
  213. return null;
  214. }
  215. if (!Arrays.equals(ndefRecord.getType(), NdefRecord.RTD_TEXT)) {
  216. return null;
  217. }
  218. try {
  219. byte[] bArray = ndefRecord.getPayload();
  220. StringBuffer sb = new StringBuffer(bArray.length);
  221. String sTemp;
  222. for (int i = 0; i < bArray.length; i++) {
  223. sTemp = Integer.toHexString(0xFF & bArray[i]);
  224. if (sTemp.length() < 2)
  225. sb.append(0);
  226. sb.append(sTemp.toUpperCase());
  227. }
  228. return sb.toString();
  229. } catch (Exception e) {
  230. throw new IllegalArgumentException();
  231. }
  232. }
  233. //记录ProgressBar的完成进度
  234. private int status = 0;
  235. private int hasDate = 0;
  236. //创建一个负责更新进度的Handler
  237. private Handler mHandler = new Handler() {
  238. @Override
  239. public void handleMessage(Message msg) {
  240. //表明消息是由该程序发送的
  241. if (msg.what == 0x111) {
  242. readpb.setProgress(status);
  243. if (status == 100) {
  244. loadDiago.dismiss();
  245. }
  246. }
  247. }
  248. };
  249. @Override
  250. public void onNewIntent(Intent intent) {
  251. textRecord = readNfcTag(intent);
  252. if (textRecord == null || textRecord.length() < chipNumberEndIndex) {
  253. toast("读取失败");
  254. return;
  255. } else {
  256. hasDate = 0;
  257. status = 0;
  258. loadDiago = new BaseDialogFragment.Builder(this)
  259. .setContentView(R.layout.progressreader)
  260. .setAnimStyle(BaseDialog.AnimStyle.SCALE)
  261. //.setText(id, "我是预设置的文本")
  262. .addOnShowListener(new BaseDialog.OnShowListener() {
  263. @Override
  264. public void onShow(BaseDialog dialog) {
  265. //toast("Dialog 显示了");
  266. }
  267. })
  268. .addOnCancelListener(new BaseDialog.OnCancelListener() {
  269. @Override
  270. public void onCancel(BaseDialog dialog) {
  271. //toast("Dialog 取消了");
  272. }
  273. })
  274. .addOnDismissListener(new BaseDialog.OnDismissListener() {
  275. @Override
  276. public void onDismiss(BaseDialog dialog) {
  277. //进度条走完 进行加载
  278. isWarning = false;
  279. chipNumber = textRecord.substring(6, chipNumberEndIndex);
  280. uploadChip();
  281. alarmDetection();
  282. }
  283. })
  284. .show();
  285. readpb = loadDiago.findViewById(R.id.read_progress);
  286. //启动线程来执行任务
  287. new Thread() {
  288. @Override
  289. public void run() {
  290. super.run();
  291. while (status < 100) {
  292. //获取耗时操作的完成百分比
  293. status = doWork();
  294. //发送消息
  295. mHandler.sendEmptyMessage(0x111);
  296. }
  297. }
  298. }.start();
  299. }
  300. }
  301. //进行进度条加载
  302. private int doWork() {
  303. //为元素赋值
  304. hasDate += 10;
  305. try {
  306. Thread.sleep(200);
  307. } catch (InterruptedException e) {
  308. e.printStackTrace();
  309. }
  310. return hasDate;
  311. }
  312. //判断是否报警
  313. public void alarmDetection() {
  314. try {
  315. String binaryStr = ConversionUtil.hexToBins(textRecord.substring((3 + 40 + 1 + 4 + 8) * 2));
  316. binaryStr = binaryStr.substring(4, binaryStr.length() - 8); //减去启用后的一小时和注射前的两小时
  317. Log.e("温度二进制", binaryStr);
  318. String binaryArr[] = new String[binaryStr.length() / 2];
  319. for (int i = 0; i < binaryArr.length; i++) {
  320. binaryArr[i] = String.valueOf(binaryStr.charAt(i * 2)) + binaryStr.charAt(i * 2 + 1);
  321. }
  322. LinkedList<Integer> exceedingIndexs = new LinkedList<Integer>();
  323. exceedingIndexs.add(-1);
  324. for (int i = 0; i < binaryArr.length; i++) {
  325. if (!binaryArr[i].equals("01")) {
  326. if (i != 0 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i)) {
  327. exceedingIndexs.add(i);
  328. }
  329. if (i != binaryArr.length - 1 && !exceedingIndexs.get(exceedingIndexs.size() - 1).equals(i + 1)) {
  330. exceedingIndexs.add(i + 1);
  331. }
  332. }
  333. }
  334. int type = Integer.parseInt(chipNumber.substring(1, 2), 16);
  335. int category = Integer.parseInt(SPUtils.get("CATEGORY_TIMES_" + type, 48).toString());
  336. if ((exceedingIndexs.size() - 1) / 2.f > category) {
  337. // toast("报警");
  338. isWarning = true;
  339. soundPoolHelper.play("xufuhe", false);
  340. //warning();
  341. } else {
  342. isWarning = false;
  343. soundPoolHelper.play("zhengchang", false);
  344. }
  345. readingProgress.setProgress(100);
  346. } catch (Exception e) {
  347. e.printStackTrace();
  348. }
  349. }
  350. private void uploadChip() {
  351. if (textRecord != null && textRecord.length() > chipNumberEndIndex) {
  352. if (SPUtils.contains("LOCATION")) {
  353. Log.e("LOCATION", SPUtils.get("LOCATION", "").toString());
  354. String location[] = SPUtils.get("LOCATION", "").toString().split(",");
  355. if (location.length > 1) {
  356. Double latitude = Double.parseDouble(location[0]);
  357. Double longitude = Double.parseDouble(location[1]);
  358. String inoculators = (String) SPUtils.get("INOCULATOR_LIST", "");
  359. Log.e("chipNumber", chipNumber);
  360. Log.e("textRecord", textRecord);
  361. getPresenter().forDoctor(chipNumber, textRecord, inoculators, longitude, latitude);
  362. chipModel = new ChipModel(chipNumber, textRecord, inoculators, longitude, latitude);
  363. } else {
  364. toast("位置信息错误");
  365. }
  366. } else {
  367. toast("位置信息获取失败");
  368. }
  369. } else {
  370. toast("芯片识别错误");
  371. }
  372. }
  373. @Override
  374. public void uploadChipError(String msg) {
  375. if (msg.equals("芯片不存在")) {
  376. // soundPoolHelper.play("factory_operator_error",false);
  377. }
  378. //保存未提交信息
  379. if (msg.indexOf("请检查您的网络状态") != -1) {
  380. String user_id = (String) SPUtils.get("USER_ID", "");
  381. if (!user_id.equals("")) {
  382. ArrayList<ChipModel> chipModelList = (ArrayList<ChipModel>) SPUtils.get("CHIP_MODEL_LIST_" + user_id, new ArrayList<ChipModel>());
  383. chipModelList.add(chipModel);
  384. SPUtils.put("CHIP_MODEL_LIST_" + user_id, chipModelList);
  385. SPUtils.remove("INOCULATOR_LIST");
  386. finish();
  387. }
  388. }
  389. toast(msg);
  390. }
  391. @Override
  392. public void uploadChipSuccess(VnDetailBean data) {
  393. VnDetailBean.DataBean dataBean = data.getData();
  394. // soundPoolHelper.play("factory_operator_success",false);
  395. SPUtils.remove("INOCULATOR_LIST");
  396. Intent in = new Intent(ReadingActivity.this, VnReportDetailForDoctorActivity.class);
  397. in.putExtra("dataBean", dataBean);
  398. in.putExtra("isWarning", isWarning);
  399. startActivityFinish(in);
  400. }
  401. private void warning() {
  402. new MessageDialog.Builder(this)
  403. .setTitle("") // 标题可以不用填写
  404. .setMessage("此疫苗需复核,是否继续使用?")
  405. .setConfirm("确定")
  406. .setCancel("取消") // 设置 null 表示不显示取消按钮
  407. //.setAutoDismiss(false) // 设置点击按钮后不关闭对话框
  408. .setListener(new MessageDialog.OnListener() {
  409. @Override
  410. public void onConfirm(Dialog dialog) {
  411. uploadChip();
  412. }
  413. @Override
  414. public void onCancel(Dialog dialog) {
  415. //toast("取消了");
  416. }
  417. })
  418. .show();
  419. }
  420. @Override
  421. protected void onStart() {
  422. super.onStart();
  423. }
  424. @Override
  425. protected void onStop() {
  426. super.onStop();
  427. }
  428. @Override
  429. protected void onDestroy() {
  430. animation.cancel();
  431. alp.cancel();
  432. mHandler.removeCallbacksAndMessages(true);
  433. super.onDestroy();
  434. }
  435. //
  436. // @Override
  437. // public void onBackPressed() {
  438. // if (DoubleClickHelper.isOnDoubleClick()) {
  439. // //移动到上一个任务栈,避免侧滑引起的不良反应
  440. // moveTaskToBack(false);
  441. // postDelayed(new Runnable() {
  442. //
  443. // @Override
  444. // public void run() {
  445. // // 进行内存优化,销毁掉所有的界面
  446. // ActivityStackManager.getInstance().finishAllActivities();
  447. // // 销毁进程
  448. // System.exit(0);
  449. // }
  450. // }, 300);
  451. // } else {
  452. // toast(getResources().getString(R.string.home_exit_hint));
  453. // }
  454. // }
  455. @Override
  456. public boolean isSupportSwipeBack() {
  457. // 不使用侧滑功能
  458. return false;
  459. }
  460. }