SendFragment.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. package com.emato.ich.fragment;
  2. import android.os.Bundle;
  3. import android.os.CountDownTimer;
  4. import android.text.Editable;
  5. import com.emato.ich.utils.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.TextView;
  10. import androidx.annotation.NonNull;
  11. import androidx.annotation.Nullable;
  12. import androidx.fragment.app.Fragment;
  13. import androidx.navigation.fragment.NavHostFragment;
  14. import com.emato.ich.MainActivity;
  15. import com.emato.ich.R;
  16. import com.emato.ich.api.ICSPClient;
  17. import com.emato.ich.api.ICSPResponseCodeEnum;
  18. import com.emato.ich.contant.SystemConfigConstant;
  19. import com.emato.ich.databinding.FragmentSendBinding;
  20. import com.emato.ich.entity.vo.ResponseData;
  21. import com.emato.ich.entity.vo.ResponseTokenVo;
  22. import com.emato.ich.local.LocalStorage;
  23. import com.emato.ich.utils.BaseUtils;
  24. import com.emato.ich.utils.ButtonUtils;
  25. import com.emato.ich.utils.JacksonUtils;
  26. import com.emato.ich.utils.LoggingUtils;
  27. import com.emato.ich.utils.StringUtils;
  28. import com.emato.ich.utils.TimeOutUtils;
  29. import com.emato.ich.utils.ToastUtils;
  30. import com.fasterxml.jackson.core.JsonProcessingException;
  31. import com.fasterxml.jackson.core.type.TypeReference;
  32. import org.jetbrains.annotations.NotNull;
  33. import java.io.IOException;
  34. import java.util.regex.Pattern;
  35. import okhttp3.Call;
  36. import okhttp3.Callback;
  37. import okhttp3.Response;
  38. /**
  39. * 投递员登录页面
  40. */
  41. public class SendFragment extends Fragment {
  42. private static final String TAG = SendFragment.class.getName();
  43. private FragmentSendBinding binding;
  44. private CountDownTimer timer;
  45. @Nullable
  46. @org.jetbrains.annotations.Nullable
  47. @Override
  48. public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
  49. binding = FragmentSendBinding.inflate(inflater, container, false);
  50. return binding.getRoot();
  51. }
  52. public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
  53. super.onViewCreated(view, savedInstanceState);
  54. BaseUtils.disableEditText(binding.editTextTextPersonName4);
  55. BaseUtils.disableEditText(binding.editTextTextPersonName5);
  56. try {
  57. MainActivity activity = (MainActivity) getActivity();
  58. timer = TimeOutUtils.timeout(activity, SendFragment.this, binding.timeout, 60);
  59. timer.start();
  60. } catch (Exception e) {
  61. Log.e(TAG, "onViewCreated: 倒计时异常! ", e);
  62. LoggingUtils.sendErrorLog("业务异常: 投递员登录页面倒计时异常! ", e);
  63. }
  64. // 如果有配置账号密码, 账号定死
  65. String loginPhone = null;
  66. try {
  67. MainActivity activity = (MainActivity) getActivity();
  68. loginPhone = activity.getConfigMap().get(SystemConfigConstant.cabinet_login_phone);
  69. } catch (Exception e) {
  70. Log.e(TAG, "onViewCreated: 配置登录手机号出错! ", e);
  71. LoggingUtils.sendErrorLog("业务异常: 配置登录手机号出错! ", e);
  72. }
  73. if (!StringUtils.isNullOrEmpty(loginPhone)) {
  74. String loginPhoneShow = toHidePhone(loginPhone);
  75. binding.editTextTextPersonName4.setText(loginPhoneShow);
  76. binding.editTextTextPersonName4.setEnabled(false);
  77. } else {
  78. // 4 手机
  79. binding.editTextTextPersonName4.setOnFocusChangeListener((view1, hasFocus) -> {
  80. if (hasFocus) {
  81. binding.inputButton0.setOnClickListener(v -> {
  82. int length = binding.editTextTextPersonName4.getText().length();
  83. if (length >= 11) {
  84. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  85. return;
  86. }
  87. int start = binding.editTextTextPersonName4.getSelectionStart();
  88. binding.editTextTextPersonName4.getText().insert(start, "0");
  89. });
  90. binding.inputButton1.setOnClickListener(v -> {
  91. int length = binding.editTextTextPersonName4.getText().length();
  92. if (length >= 11) {
  93. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  94. return;
  95. }
  96. int start = binding.editTextTextPersonName4.getSelectionStart();
  97. binding.editTextTextPersonName4.getText().insert(start, "1");
  98. });
  99. binding.inputButton2.setOnClickListener(v -> {
  100. int length = binding.editTextTextPersonName4.getText().length();
  101. if (length >= 11) {
  102. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  103. return;
  104. }
  105. int start = binding.editTextTextPersonName4.getSelectionStart();
  106. binding.editTextTextPersonName4.getText().insert(start, "2");
  107. });
  108. binding.inputButton3.setOnClickListener(v -> {
  109. int length = binding.editTextTextPersonName4.getText().length();
  110. if (length >= 11) {
  111. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  112. return;
  113. }
  114. int start = binding.editTextTextPersonName4.getSelectionStart();
  115. binding.editTextTextPersonName4.getText().insert(start, "3");
  116. });
  117. binding.inputButton4.setOnClickListener(v -> {
  118. int length = binding.editTextTextPersonName4.getText().length();
  119. if (length >= 11) {
  120. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  121. return;
  122. }
  123. int start = binding.editTextTextPersonName4.getSelectionStart();
  124. binding.editTextTextPersonName4.getText().insert(start, "4");
  125. });
  126. binding.inputButton5.setOnClickListener(v -> {
  127. int length = binding.editTextTextPersonName4.getText().length();
  128. if (length >= 11) {
  129. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  130. return;
  131. }
  132. int start = binding.editTextTextPersonName4.getSelectionStart();
  133. binding.editTextTextPersonName4.getText().insert(start, "5");
  134. });
  135. binding.inputButton6.setOnClickListener(v -> {
  136. int length = binding.editTextTextPersonName4.getText().length();
  137. if (length >= 11) {
  138. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  139. return;
  140. }
  141. int start = binding.editTextTextPersonName4.getSelectionStart();
  142. binding.editTextTextPersonName4.getText().insert(start, "6");
  143. });
  144. binding.inputButton7.setOnClickListener(v -> {
  145. int length = binding.editTextTextPersonName4.getText().length();
  146. if (length >= 11) {
  147. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  148. return;
  149. }
  150. int start = binding.editTextTextPersonName4.getSelectionStart();
  151. binding.editTextTextPersonName4.getText().insert(start, "7");
  152. });
  153. binding.inputButton8.setOnClickListener(v -> {
  154. int length = binding.editTextTextPersonName4.getText().length();
  155. if (length >= 11) {
  156. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  157. return;
  158. }
  159. int start = binding.editTextTextPersonName4.getSelectionStart();
  160. binding.editTextTextPersonName4.getText().insert(start, "8");
  161. });
  162. binding.inputButton9.setOnClickListener(v -> {
  163. int length = binding.editTextTextPersonName4.getText().length();
  164. if (length >= 11) {
  165. ToastUtils.make(getContext(), "手机号不能超过11位! ");
  166. return;
  167. }
  168. int start = binding.editTextTextPersonName4.getSelectionStart();
  169. binding.editTextTextPersonName4.getText().insert(start, "9");
  170. });
  171. binding.inputButtonCancel.setOnClickListener(v -> {
  172. Editable text = binding.editTextTextPersonName4.getText();
  173. if (text.length() > 0) {
  174. text.delete(text.length()-1, text.length());
  175. binding.editTextTextPersonName4.setText(text, TextView.BufferType.EDITABLE);
  176. binding.editTextTextPersonName4.setSelection(binding.editTextTextPersonName4.getText().length());
  177. }
  178. });
  179. // 长按删除
  180. binding.inputButtonCancel.setOnLongClickListener(v -> {
  181. binding.editTextTextPersonName4.getText().clear();
  182. return false;
  183. });
  184. }
  185. });
  186. }
  187. String finalLoginPhone = loginPhone;
  188. binding.inputButtonConfirm.setOnClickListener(view1 -> {
  189. if (ButtonUtils.isFastClick()) {
  190. return;
  191. }
  192. // 登录逻辑 editTextTextPersonName4 手机 editTextTextPersonName5 密码
  193. String sendPhone = !StringUtils.isNullOrEmpty(finalLoginPhone) ? finalLoginPhone : binding.editTextTextPersonName4.getText().toString();
  194. String password = binding.editTextTextPersonName5.getText().toString();
  195. Pattern phonePattern = Pattern.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");
  196. Pattern pwdPattern = Pattern.compile("^[0-9]{8,16}$");
  197. if (phonePattern.matcher(sendPhone).matches() && pwdPattern.matcher(password).matches()) {
  198. ICSPClient.login(sendPhone, password, new Callback() {
  199. @Override
  200. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  201. // TODO 登录失败处理
  202. ToastUtils.make(getContext(), "登录失败!网络异常!");
  203. Log.e(TAG, "onFailure: 登录失败! call: " + call.timeout().toString(), e);
  204. LoggingUtils.sendErrorLog("业务异常: 登录失败!网络异常! ", e);
  205. }
  206. @Override
  207. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  208. ((MainActivity) getActivity()).runOnUiThread(() -> {
  209. String responseStr = ICSPClient.isSuccessfulAndParseResponse(response);
  210. if (!StringUtils.isNullOrEmpty(responseStr)) {
  211. try {
  212. ResponseData<ResponseTokenVo> responseData = JacksonUtils.objectmapper.readValue(responseStr, new TypeReference<ResponseData<ResponseTokenVo>>() {});
  213. ResponseTokenVo data = responseData.getData();
  214. if (responseData.getCode().equals(ICSPResponseCodeEnum.OK.getCode())) {
  215. LocalStorage.Session session = new LocalStorage.Session();
  216. session.setPhone(sendPhone);
  217. session.setTime(System.currentTimeMillis());
  218. session.setToken(data.getToken());
  219. LocalStorage.getInstance().setSession(session);
  220. // 登录成功
  221. ToastUtils.make(getContext(), "登录成功!");
  222. timer.cancel();
  223. NavHostFragment.findNavController(SendFragment.this).navigate(R.id.action_sendFragment_to_sendMainFragment);
  224. } else {
  225. ICSPResponseCodeEnum.responseHint(getContext(), responseData);
  226. Log.w(TAG, "onResponse: " + responseData.getMsg());
  227. }
  228. } catch (JsonProcessingException e) {
  229. Log.e(TAG, "onViewCreated: 解析登录响应信息错误! response body: " + responseStr, e);
  230. ToastUtils.make(getContext(), "登录失败!");
  231. LoggingUtils.sendErrorLog("业务异常: 登录失败!", e);
  232. } catch (ClassCastException e) {
  233. Log.e(TAG, "onResponse: 解析登录响应信息类型转换错误! response body: " + responseStr, e);
  234. ToastUtils.make(getContext(), "登录失败!");
  235. LoggingUtils.sendErrorLog("业务异常: 登录失败!", e);
  236. } catch (RuntimeException e) {
  237. Log.e(TAG, "onResponse: 登录失败! ", e);
  238. ToastUtils.make(getContext(), "登录失败!");
  239. LoggingUtils.sendErrorLog("业务异常: 登录失败!未知错误! ", e);
  240. }
  241. } else {
  242. // 登录失败
  243. ToastUtils.make(getContext(), "服务异常!请稍后重试!");
  244. }
  245. });
  246. }
  247. });
  248. } else if (!phonePattern.matcher(sendPhone).matches()){
  249. ToastUtils.make(getContext(), "输入正确的手机号!");
  250. } else if (!pwdPattern.matcher(password).matches()) {
  251. ToastUtils.make(getContext(), "密码格式错误!请输入8-16位的数字!");
  252. }
  253. });
  254. // 密码
  255. binding.editTextTextPersonName5.setOnFocusChangeListener((view1, hasFocus) -> {
  256. if (hasFocus) {
  257. binding.inputButton0.setOnClickListener(v -> {
  258. int length = binding.editTextTextPersonName5.getText().length();
  259. if (length >= 16) {
  260. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  261. return;
  262. }
  263. int start = binding.editTextTextPersonName5.getSelectionStart();
  264. binding.editTextTextPersonName5.getText().insert(start, "0");
  265. });
  266. binding.inputButton1.setOnClickListener(v -> {
  267. int length = binding.editTextTextPersonName5.getText().length();
  268. if (length >= 16) {
  269. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  270. return;
  271. }
  272. int start = binding.editTextTextPersonName5.getSelectionStart();
  273. binding.editTextTextPersonName5.getText().insert(start, "1");
  274. });
  275. binding.inputButton2.setOnClickListener(v -> {
  276. int length = binding.editTextTextPersonName5.getText().length();
  277. if (length >= 16) {
  278. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  279. return;
  280. }
  281. int start = binding.editTextTextPersonName5.getSelectionStart();
  282. binding.editTextTextPersonName5.getText().insert(start, "2");
  283. });
  284. binding.inputButton3.setOnClickListener(v -> {
  285. int length = binding.editTextTextPersonName5.getText().length();
  286. if (length >= 16) {
  287. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  288. return;
  289. }
  290. int start = binding.editTextTextPersonName5.getSelectionStart();
  291. binding.editTextTextPersonName5.getText().insert(start, "3");
  292. });
  293. binding.inputButton4.setOnClickListener(v -> {
  294. int length = binding.editTextTextPersonName5.getText().length();
  295. if (length >= 16) {
  296. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  297. return;
  298. }
  299. int start = binding.editTextTextPersonName5.getSelectionStart();
  300. binding.editTextTextPersonName5.getText().insert(start, "4");
  301. });
  302. binding.inputButton5.setOnClickListener(v -> {
  303. int length = binding.editTextTextPersonName5.getText().length();
  304. if (length >= 16) {
  305. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  306. return;
  307. }
  308. int start = binding.editTextTextPersonName5.getSelectionStart();
  309. binding.editTextTextPersonName5.getText().insert(start, "5");
  310. });
  311. binding.inputButton6.setOnClickListener(v -> {
  312. int length = binding.editTextTextPersonName5.getText().length();
  313. if (length >= 16) {
  314. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  315. return;
  316. }
  317. int start = binding.editTextTextPersonName5.getSelectionStart();
  318. binding.editTextTextPersonName5.getText().insert(start, "6");
  319. });
  320. binding.inputButton7.setOnClickListener(v -> {
  321. int length = binding.editTextTextPersonName5.getText().length();
  322. if (length >= 16) {
  323. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  324. return;
  325. }
  326. int start = binding.editTextTextPersonName5.getSelectionStart();
  327. binding.editTextTextPersonName5.getText().insert(start, "7");
  328. });
  329. binding.inputButton8.setOnClickListener(v -> {
  330. int length = binding.editTextTextPersonName5.getText().length();
  331. if (length >= 16) {
  332. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  333. return;
  334. }
  335. int start = binding.editTextTextPersonName5.getSelectionStart();
  336. binding.editTextTextPersonName5.getText().insert(start, "8");
  337. });
  338. binding.inputButton9.setOnClickListener(v -> {
  339. int length = binding.editTextTextPersonName5.getText().length();
  340. if (length >= 16) {
  341. ToastUtils.make(getContext(), "密码最多不能超过16位! ");
  342. return;
  343. }
  344. int start = binding.editTextTextPersonName5.getSelectionStart();
  345. binding.editTextTextPersonName5.getText().insert(start, "9");
  346. });
  347. binding.inputButtonCancel.setOnClickListener(v -> {
  348. Editable text = binding.editTextTextPersonName5.getText();
  349. if (text.length() > 0) {
  350. text.delete(text.length()-1, text.length());
  351. binding.editTextTextPersonName5.setText(text, TextView.BufferType.EDITABLE);
  352. binding.editTextTextPersonName5.setSelection(binding.editTextTextPersonName5.getText().length());
  353. }
  354. });
  355. // 长按删除
  356. binding.inputButtonCancel.setOnLongClickListener(v -> {
  357. binding.editTextTextPersonName5.getText().clear();
  358. return false;
  359. });
  360. }
  361. });
  362. binding.returnBtn.setOnClickListener(view1 -> {
  363. if (ButtonUtils.isFastClick()) {
  364. return;
  365. }
  366. timer.cancel();
  367. NavHostFragment.findNavController(SendFragment.this)
  368. .navigate(R.id.action_sendFragment_to_mainFragment);
  369. });
  370. // 默认选中密码输入
  371. if (!StringUtils.isNullOrEmpty(binding.editTextTextPersonName4.getText().toString())) {
  372. binding.editTextTextPersonName5.requestFocus();
  373. } else {
  374. binding.editTextTextPersonName4.requestFocus();
  375. }
  376. }
  377. /**
  378. * 隐藏部分信息
  379. * @param loginPhone 投递员手机号
  380. * @return 隐藏后的手机号
  381. */
  382. private String toHidePhone(String loginPhone) {
  383. StringBuilder stringBuilder = new StringBuilder();
  384. char[] chars = loginPhone.toCharArray();
  385. for (int i = 0; i < chars.length; i++) {
  386. if (i > 2 && i < 8) {
  387. stringBuilder.append('*');
  388. } else {
  389. stringBuilder.append(chars[i]);
  390. }
  391. }
  392. return stringBuilder.toString();
  393. }
  394. @Override
  395. public void onDestroyView() {
  396. if (timer != null) {
  397. timer.cancel();
  398. timer = null;
  399. }
  400. super.onDestroyView();
  401. binding = null;
  402. }
  403. }