LoginAlertPresenter.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. package com.edufound.reader.presenter;
  2. import android.content.Intent;
  3. import android.graphics.Color;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.text.Spannable;
  7. import android.text.SpannableStringBuilder;
  8. import android.text.TextPaint;
  9. import android.text.TextUtils;
  10. import android.text.method.LinkMovementMethod;
  11. import android.text.style.ClickableSpan;
  12. import android.view.View;
  13. import android.widget.FrameLayout;
  14. import android.widget.ImageView;
  15. import android.widget.TextView;
  16. import android.widget.Toast;
  17. import com.edufound.reader.activity.WebActivity;
  18. import com.edufound.reader.apiserver.OrderApiServerImpl;
  19. import com.edufound.reader.apiserver.UserApiServerImpl;
  20. import com.edufound.reader.base.BasePresenter;
  21. import com.edufound.reader.bean.ChannelCodeEnum;
  22. import com.edufound.reader.bean.HttpResultBean;
  23. import com.edufound.reader.bean.SignBean;
  24. import com.edufound.reader.bean.UserBean;
  25. import com.edufound.reader.contract.LoginAlertContract;
  26. import com.edufound.reader.cusview.CusToast;
  27. import com.edufound.reader.interfaces.EfunboxInterfaces;
  28. import com.edufound.reader.model.LoginAlertModel;
  29. import com.edufound.reader.util.Consts;
  30. import com.edufound.reader.util.DeviceUuidFactory;
  31. import com.edufound.reader.util.EfunboxUtil;
  32. import com.edufound.reader.util.GlideUtils;
  33. import com.edufound.reader.util.MMKVEncodeKey;
  34. import com.edufound.reader.util.MMKVUtil;
  35. import com.google.gson.Gson;
  36. import com.google.gson.reflect.TypeToken;
  37. import com.jakewharton.rxbinding4.view.RxView;
  38. import com.okhttplib.HttpInfo;
  39. import com.okhttplib.callback.Callback;
  40. import com.orhanobut.logger.Logger;
  41. import org.json.JSONObject;
  42. import java.io.IOException;
  43. import java.util.ArrayList;
  44. import java.util.HashMap;
  45. import java.util.List;
  46. import java.util.Map;
  47. import java.util.concurrent.TimeUnit;
  48. import io.reactivex.rxjava3.annotations.NonNull;
  49. import io.reactivex.rxjava3.functions.Consumer;
  50. public class LoginAlertPresenter extends BasePresenter<LoginAlertContract.View> implements LoginAlertContract.Presenter {
  51. LoginAlertModel mModel;
  52. UserApiServerImpl mUserApi;
  53. List<Integer> leftBrackets = new ArrayList<>();
  54. List<Integer> rightBrackets = new ArrayList<>();
  55. String mServiceText = "点击登录表示您已阅读并同意《用户隐私政策》和《服务协议》。";
  56. int getVCode;
  57. int mVCodeResCount = 60;
  58. boolean loginSuccess = false;
  59. OrderApiServerImpl mOrderApi;
  60. public LoginAlertPresenter() {
  61. mModel = new LoginAlertModel();
  62. mUserApi = new UserApiServerImpl();
  63. mOrderApi = new OrderApiServerImpl();
  64. }
  65. @Override
  66. public void initServiceText(TextView textView) {
  67. leftBrackets = getChildIndexFromString(mServiceText, "《");
  68. rightBrackets = getChildIndexFromString(mServiceText, "》");
  69. SpannableStringBuilder style = new SpannableStringBuilder();
  70. style.append(mServiceText);
  71. for (int i = 0; i < leftBrackets.size(); i++) {
  72. final int finalI = i;
  73. style.setSpan(new ClickableSpan() {
  74. @Override
  75. public void onClick(@NonNull View widget) {
  76. lookPrivacy(finalI);
  77. }
  78. @Override
  79. public void updateDrawState(@NonNull TextPaint ds) {
  80. ds.setUnderlineText(false);
  81. ds.setColor(Color.parseColor("#68a5dc"));
  82. }
  83. }, leftBrackets.get(i), rightBrackets.get(i) + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  84. }
  85. textView.setMovementMethod(LinkMovementMethod.getInstance());
  86. textView.setHighlightColor(Color.parseColor("#ffffff"));
  87. textView.setText(style);
  88. }
  89. @Override
  90. public void getVCode(String phoneNum) {
  91. if (EfunboxUtil.isMobileNO(phoneNum)) {
  92. //正常,获取验证码
  93. // getVCode = 9999;
  94. ((FrameLayout) mView.getVCodeText().getParent()).setClickable(false);
  95. ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(false);
  96. // ((FrameLayout) mView.getVCodeText().getParent()).setBackgroundColor(mView.getActivity().getResources().getColor(R.color.translucent_background));
  97. mModel.getVCode(mView.getActivity(), phoneNum, new Callback() {
  98. @Override
  99. public void onSuccess(HttpInfo info) throws IOException {
  100. String result = info.getRetDetail();
  101. mView.getVCodeText().setText(String.valueOf(mVCodeResCount));
  102. mLoginAlertHandler.sendEmptyMessageDelayed(LoginAlertModel.CHANGE_VCODE_TEXT, 1000);
  103. Logger.e("获取验证码result:" + result);
  104. // getVCode = 9999;
  105. }
  106. @Override
  107. public void onFailure(HttpInfo info) throws IOException {
  108. Logger.e("获取验证码失败:" + info.getRetDetail() + "--" + info.getParams() + "--" + info.getUrl());
  109. Toast.makeText(mView.getActivity(), "获取验证码失败," + info.getRetDetail(), Toast.LENGTH_SHORT).show();
  110. ((FrameLayout) mView.getVCodeText().getParent()).setClickable(true);
  111. ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(true);
  112. }
  113. });
  114. } else {
  115. Toast.makeText(mView.getActivity(), "请输入正确的手机号", Toast.LENGTH_SHORT).show();
  116. //不正常
  117. }
  118. }
  119. @Override
  120. public void Login(String phoneNum, String inputVCode) {
  121. if (EfunboxUtil.isMobileNO(phoneNum)) {
  122. //手机号没有改过,正常。获取了验证码了,判断验证码
  123. if (TextUtils.isEmpty(inputVCode)) {
  124. Toast.makeText(mView.getActivity(), "请输入验证码", Toast.LENGTH_SHORT).show();
  125. return;
  126. } else {
  127. if (mView.getActivity().getLocalClassName().contains("LoginAlertActivity")) {
  128. if (!mView.getCheckBox().isChecked()) {
  129. Toast.makeText(mView.getActivity(), "请勾选用户隐私政策和服务协议", Toast.LENGTH_SHORT).show();
  130. return;
  131. }
  132. }
  133. // if (Integer.valueOf(inputVCode) == getVCode || Integer.valueOf(inputVCode) == 9999) {
  134. //输入的和返回的是一样的
  135. //请求接口,根据phoneNum,Integer.valueOf(inputVCode)
  136. Map<String, String> params = new HashMap<>();
  137. params.put("channel", Consts.getUMengChannel());
  138. params.put("deviceCode", DeviceUuidFactory.getUuid().toString());
  139. params.put("mobileNo", phoneNum);
  140. params.put("verifyCode", inputVCode);
  141. params.put("channel", Consts.getUMengChannel());
  142. params.put("verify", "true");
  143. if (MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE).equals("") || MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE) == null) {
  144. //如果没有,默认给一年级
  145. params.put("grade", "PRIMARY_FIRST_GRADE");
  146. } else {
  147. params.put("grade", MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE));
  148. }
  149. mUserApi.registerMobileByVCode(mView.getActivity(), new Gson().toJson(params), new Callback() {
  150. @Override
  151. public void onSuccess(HttpInfo info) throws IOException {
  152. CusToast.getInstance(mView.getActivity()).show("登录成功", 3000);
  153. HttpResultBean<UserBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserBean>>() {
  154. }.getType());
  155. Consts.setUID(bean.getData().getUid());
  156. //用户是否登录,登录了,创建Consts的userbean
  157. Consts.setmConstsUserBean(bean.getData());
  158. EfunboxUtil.getYFVip(mView.getActivity(), new EfunboxInterfaces.getYFVipInterfaces() {
  159. @Override
  160. public void success(long time) {
  161. mView.getActivity().finish();
  162. }
  163. @Override
  164. public void error() {
  165. mView.getActivity().finish();
  166. }
  167. });
  168. //检查活动
  169. EfunboxUtil.checkEvents(mView.getActivity());
  170. }
  171. @Override
  172. public void onFailure(HttpInfo info) throws IOException {
  173. Logger.e("注册失败:" + info.getRetDetail());
  174. Logger.e("注册失败:" + info.getParamJson());
  175. Toast.makeText(mView.getActivity(), "注册失败," + info.getRetDetail(), Toast.LENGTH_SHORT).show();
  176. }
  177. });
  178. // } else {
  179. // Toast.makeText(mView.getActivity(), "验证码输入错误", Toast.LENGTH_SHORT).show();
  180. // }
  181. }
  182. } else {
  183. Toast.makeText(mView.getActivity(), "请输入正确的手机号", Toast.LENGTH_SHORT).show();
  184. //不正常
  185. }
  186. }
  187. @Override
  188. public void activityDestory() {
  189. mLoginAlertHandler.removeMessages(LoginAlertModel.CHANGE_VCODE_TEXT);
  190. mLoginAlertHandler.removeMessages(0x1313);
  191. mLoginAlertHandler = null;
  192. }
  193. @Override
  194. public void showLoginQRCode(ImageView img) {
  195. mUserApi.getLoginQRCode(new Callback() {
  196. @Override
  197. public void onSuccess(HttpInfo info) throws IOException {
  198. Logger.e("info:" + info.getRetDetail());
  199. HttpResultBean<String> bean = info.getRetDetail(new TypeToken<HttpResultBean<String>>() {
  200. }.getType());
  201. Logger.e("bean.getData:" + bean.getData());
  202. if (bean.getCode().equals("200") && bean.getSuccess()) {
  203. Logger.e("加载二维码");
  204. GlideUtils.loadImageSizeKipMemoryCache(mView.getActivity(), bean.getData(), img);
  205. loginSuccess = false;
  206. mLoginAlertHandler.sendEmptyMessageDelayed(0x1313, 1000);
  207. } else {
  208. Logger.e("加载二维码失败");
  209. }
  210. }
  211. @Override
  212. public void onFailure(HttpInfo info) throws IOException {
  213. Logger.e("获取登录二维码失败");
  214. }
  215. });
  216. }
  217. Handler mLoginAlertHandler = new Handler(new Handler.Callback() {
  218. @Override
  219. public boolean handleMessage(@androidx.annotation.NonNull Message message) {
  220. switch (message.what) {
  221. case LoginAlertModel.CHANGE_VCODE_TEXT:
  222. if (mVCodeResCount > 1) {
  223. mVCodeResCount--;
  224. mView.getVCodeText().setText(String.valueOf(mVCodeResCount));
  225. mLoginAlertHandler.sendEmptyMessageDelayed(LoginAlertModel.CHANGE_VCODE_TEXT, 1000);
  226. } else {
  227. mVCodeResCount = 60;
  228. mView.getVCodeText().setText("获取验证码");
  229. ((FrameLayout) mView.getVCodeText().getParent()).setClickable(true);
  230. ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(true);
  231. // ((FrameLayout) mView.getVCodeText().getParent()).setBackgroundResource(R.drawable.activity_loginalert_verificationcode_bg);
  232. }
  233. break;
  234. case 0x1313:
  235. if (loginSuccess) {
  236. mLoginAlertHandler.removeMessages(0x1313);
  237. return true;
  238. }
  239. mUserApi.isLogin(mView.getActivity(), DeviceUuidFactory.getUuid(), new Callback() {
  240. @Override
  241. public void onSuccess(HttpInfo info) throws IOException {
  242. try {
  243. JSONObject object = new JSONObject(info.getRetDetail());
  244. if (object.getString("code").equals("200") || object.getInt("code") == 200) {
  245. //200算成功
  246. mLoginAlertHandler.removeMessages(0x1313);
  247. loginSuccess = true;
  248. HttpResultBean<UserBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<UserBean>>() {
  249. }.getType());
  250. Consts.setUID(bean.getData().getUid());
  251. //用户是否登录,登录了,创建Consts的userbean
  252. Consts.setmConstsUserBean(bean.getData());
  253. mUserApi.loginSign(null, new Callback() {
  254. @Override
  255. public void onSuccess(HttpInfo info) throws IOException {
  256. try {
  257. HttpResultBean<SignBean> bean = info.getRetDetail(new TypeToken<HttpResultBean<SignBean>>() {
  258. }.getType());
  259. if (bean.getData().getIsSign()) {
  260. CusToast.getInstance(Consts.getmApplicAtion()).show("恭喜签到成功\n奖励" + bean.getData().getCount() + "朵小红花", 2000);
  261. }
  262. } catch (Exception e) {
  263. e.printStackTrace();
  264. } finally {
  265. if (!Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  266. //不是小度的,检查权限
  267. if (Consts.getmConstsUserBean() != null) {
  268. mOrderApi.getAuth(new Callback() {
  269. @Override
  270. public void onSuccess(HttpInfo info) throws IOException {
  271. HttpResultBean<String> bean = info.getRetDetail(new TypeToken<HttpResultBean<String>>() {
  272. }.getType());
  273. if (!TextUtils.isEmpty(bean.getData())) {
  274. Consts.setIsYFVip(true);
  275. } else {
  276. Consts.setIsYFVip(false);
  277. }
  278. //关闭界面
  279. mView.getActivity().finish();
  280. }
  281. @Override
  282. public void onFailure(HttpInfo info) throws IOException {
  283. Logger.e("查询权限接口失败");
  284. Consts.setIsYFVip(false);
  285. mView.getActivity().finish();
  286. }
  287. });
  288. }
  289. }
  290. }
  291. }
  292. @Override
  293. public void onFailure(HttpInfo info) throws IOException {
  294. CusToast.getInstance(Consts.getmApplicAtion()).show("其他错误:" + info.getRetDetail(), 2000);
  295. //关闭界面
  296. mView.getActivity().finish();
  297. }
  298. });
  299. } else if (object.getString("code").equals("300") || object.getInt("code") == 300) {
  300. //暂无数据
  301. Logger.e("暂无数据");
  302. mLoginAlertHandler.sendEmptyMessageDelayed(0x1313, 1000);
  303. return;
  304. } else {
  305. CusToast.getInstance(Consts.getmApplicAtion()).show(object.getString("code"), 2000);
  306. mView.getActivity().finish();
  307. }
  308. } catch (Exception e) {
  309. e.printStackTrace();
  310. Logger.e("onFailure--info.getRetDetail():" + info.getRetDetail());
  311. CusToast.getInstance(Consts.getmApplicAtion()).show(e.getMessage(), 2000);
  312. //关闭界面
  313. mView.getActivity().finish();
  314. } finally {
  315. }
  316. }
  317. @Override
  318. public void onFailure(HttpInfo info) throws IOException {
  319. // CusToast.getInstance(Consts.getmApplicAtion()).show(info.getRetDetail(), 2000);
  320. Logger.e("onFailure--info.getRetDetail():" + info.getRetDetail());
  321. //关闭界面
  322. mView.getActivity().finish();
  323. }
  324. });
  325. break;
  326. }
  327. return false;
  328. }
  329. });
  330. private List<Integer> getChildIndexFromString(String parent, String child) {
  331. int startIndex = 0;
  332. List<Integer> ids = new ArrayList<>();
  333. while (parent.indexOf(child, startIndex) != -1) {
  334. //ids.add(startIndex);
  335. startIndex = parent.indexOf(child, startIndex);
  336. ids.add(startIndex);
  337. startIndex = startIndex + child.length();
  338. }
  339. return ids;
  340. }
  341. private void lookPrivacy(int index) {
  342. String url = "";
  343. switch (index) {
  344. case 0:
  345. url = Consts.getAgreementServicesUrl();
  346. break;
  347. case 1:
  348. url = Consts.getPrivServiceUrl();
  349. break;
  350. }
  351. Intent intent = new Intent(mView.getActivity(), WebActivity.class);
  352. intent.putExtra("loadUrl", url);
  353. mView.getActivity().startActivity(intent);
  354. }
  355. private void setClickListener(View view, Consumer onNext) {
  356. RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext);
  357. }
  358. }