package com.edufound.reader.presenter; import android.content.Intent; import android.graphics.Color; import android.os.Handler; import android.os.Message; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.TextPaint; import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.edufound.reader.activity.WebActivity; import com.edufound.reader.apiserver.OrderApiServerImpl; import com.edufound.reader.apiserver.UserApiServerImpl; import com.edufound.reader.base.BasePresenter; import com.edufound.reader.bean.ChannelCodeEnum; import com.edufound.reader.bean.HttpResultBean; import com.edufound.reader.bean.SignBean; import com.edufound.reader.bean.UserBean; import com.edufound.reader.contract.LoginAlertContract; import com.edufound.reader.cusview.CusToast; import com.edufound.reader.interfaces.EfunboxInterfaces; import com.edufound.reader.model.LoginAlertModel; import com.edufound.reader.util.Consts; import com.edufound.reader.util.DeviceUuidFactory; import com.edufound.reader.util.EfunboxUtil; import com.edufound.reader.util.GlideUtils; import com.edufound.reader.util.MMKVEncodeKey; import com.edufound.reader.util.MMKVUtil; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.jakewharton.rxbinding4.view.RxView; import com.okhttplib.HttpInfo; import com.okhttplib.callback.Callback; import com.orhanobut.logger.Logger; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import io.reactivex.rxjava3.annotations.NonNull; import io.reactivex.rxjava3.functions.Consumer; public class LoginAlertPresenter extends BasePresenter implements LoginAlertContract.Presenter { LoginAlertModel mModel; UserApiServerImpl mUserApi; List leftBrackets = new ArrayList<>(); List rightBrackets = new ArrayList<>(); String mServiceText = "点击登录表示您已阅读并同意《用户隐私政策》和《服务协议》。"; int getVCode; int mVCodeResCount = 60; boolean loginSuccess = false; OrderApiServerImpl mOrderApi; public LoginAlertPresenter() { mModel = new LoginAlertModel(); mUserApi = new UserApiServerImpl(); mOrderApi = new OrderApiServerImpl(); } @Override public void initServiceText(TextView textView) { leftBrackets = getChildIndexFromString(mServiceText, "《"); rightBrackets = getChildIndexFromString(mServiceText, "》"); SpannableStringBuilder style = new SpannableStringBuilder(); style.append(mServiceText); for (int i = 0; i < leftBrackets.size(); i++) { final int finalI = i; style.setSpan(new ClickableSpan() { @Override public void onClick(@NonNull View widget) { lookPrivacy(finalI); } @Override public void updateDrawState(@NonNull TextPaint ds) { ds.setUnderlineText(false); ds.setColor(Color.parseColor("#68a5dc")); } }, leftBrackets.get(i), rightBrackets.get(i) + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setHighlightColor(Color.parseColor("#ffffff")); textView.setText(style); } @Override public void getVCode(String phoneNum) { if (EfunboxUtil.isMobileNO(phoneNum)) { //正常,获取验证码 // getVCode = 9999; ((FrameLayout) mView.getVCodeText().getParent()).setClickable(false); ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(false); // ((FrameLayout) mView.getVCodeText().getParent()).setBackgroundColor(mView.getActivity().getResources().getColor(R.color.translucent_background)); mModel.getVCode(mView.getActivity(), phoneNum, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { String result = info.getRetDetail(); mView.getVCodeText().setText(String.valueOf(mVCodeResCount)); mLoginAlertHandler.sendEmptyMessageDelayed(LoginAlertModel.CHANGE_VCODE_TEXT, 1000); Logger.e("获取验证码result:" + result); // getVCode = 9999; } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("获取验证码失败:" + info.getRetDetail() + "--" + info.getParams() + "--" + info.getUrl()); Toast.makeText(mView.getActivity(), "获取验证码失败," + info.getRetDetail(), Toast.LENGTH_SHORT).show(); ((FrameLayout) mView.getVCodeText().getParent()).setClickable(true); ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(true); } }); } else { Toast.makeText(mView.getActivity(), "请输入正确的手机号", Toast.LENGTH_SHORT).show(); //不正常 } } @Override public void Login(String phoneNum, String inputVCode) { if (EfunboxUtil.isMobileNO(phoneNum)) { //手机号没有改过,正常。获取了验证码了,判断验证码 if (TextUtils.isEmpty(inputVCode)) { Toast.makeText(mView.getActivity(), "请输入验证码", Toast.LENGTH_SHORT).show(); return; } else { if (mView.getActivity().getLocalClassName().contains("LoginAlertActivity")) { if (!mView.getCheckBox().isChecked()) { Toast.makeText(mView.getActivity(), "请勾选用户隐私政策和服务协议", Toast.LENGTH_SHORT).show(); return; } } // if (Integer.valueOf(inputVCode) == getVCode || Integer.valueOf(inputVCode) == 9999) { //输入的和返回的是一样的 //请求接口,根据phoneNum,Integer.valueOf(inputVCode) Map params = new HashMap<>(); params.put("channel", Consts.getUMengChannel()); params.put("deviceCode", DeviceUuidFactory.getUuid().toString()); params.put("mobileNo", phoneNum); params.put("verifyCode", inputVCode); params.put("channel", Consts.getUMengChannel()); params.put("verify", "true"); if (MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE).equals("") || MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE) == null) { //如果没有,默认给一年级 params.put("grade", "PRIMARY_FIRST_GRADE"); } else { params.put("grade", MMKVUtil.getInstance().decodeString(MMKVEncodeKey.USER_GRADE)); } mUserApi.registerMobileByVCode(mView.getActivity(), new Gson().toJson(params), new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { CusToast.getInstance(mView.getActivity()).show("登录成功", 3000); HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); Consts.setUID(bean.getData().getUid()); //用户是否登录,登录了,创建Consts的userbean Consts.setmConstsUserBean(bean.getData()); EfunboxUtil.getYFVip(mView.getActivity(), new EfunboxInterfaces.getYFVipInterfaces() { @Override public void success(long time) { mView.getActivity().finish(); } @Override public void error() { mView.getActivity().finish(); } }); //检查活动 EfunboxUtil.checkEvents(mView.getActivity()); } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("注册失败:" + info.getRetDetail()); Logger.e("注册失败:" + info.getParamJson()); Toast.makeText(mView.getActivity(), "注册失败," + info.getRetDetail(), Toast.LENGTH_SHORT).show(); } }); // } else { // Toast.makeText(mView.getActivity(), "验证码输入错误", Toast.LENGTH_SHORT).show(); // } } } else { Toast.makeText(mView.getActivity(), "请输入正确的手机号", Toast.LENGTH_SHORT).show(); //不正常 } } @Override public void activityDestory() { mLoginAlertHandler.removeMessages(LoginAlertModel.CHANGE_VCODE_TEXT); mLoginAlertHandler.removeMessages(0x1313); mLoginAlertHandler = null; } @Override public void showLoginQRCode(ImageView img) { mUserApi.getLoginQRCode(new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { Logger.e("info:" + info.getRetDetail()); HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); Logger.e("bean.getData:" + bean.getData()); if (bean.getCode().equals("200") && bean.getSuccess()) { Logger.e("加载二维码"); GlideUtils.loadImageSizeKipMemoryCache(mView.getActivity(), bean.getData(), img); loginSuccess = false; mLoginAlertHandler.sendEmptyMessageDelayed(0x1313, 1000); } else { Logger.e("加载二维码失败"); } } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("获取登录二维码失败"); } }); } Handler mLoginAlertHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@androidx.annotation.NonNull Message message) { switch (message.what) { case LoginAlertModel.CHANGE_VCODE_TEXT: if (mVCodeResCount > 1) { mVCodeResCount--; mView.getVCodeText().setText(String.valueOf(mVCodeResCount)); mLoginAlertHandler.sendEmptyMessageDelayed(LoginAlertModel.CHANGE_VCODE_TEXT, 1000); } else { mVCodeResCount = 60; mView.getVCodeText().setText("获取验证码"); ((FrameLayout) mView.getVCodeText().getParent()).setClickable(true); ((FrameLayout) mView.getVCodeText().getParent()).setEnabled(true); // ((FrameLayout) mView.getVCodeText().getParent()).setBackgroundResource(R.drawable.activity_loginalert_verificationcode_bg); } break; case 0x1313: if (loginSuccess) { mLoginAlertHandler.removeMessages(0x1313); return true; } mUserApi.isLogin(mView.getActivity(), DeviceUuidFactory.getUuid(), new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { try { JSONObject object = new JSONObject(info.getRetDetail()); if (object.getString("code").equals("200") || object.getInt("code") == 200) { //200算成功 mLoginAlertHandler.removeMessages(0x1313); loginSuccess = true; HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); Consts.setUID(bean.getData().getUid()); //用户是否登录,登录了,创建Consts的userbean Consts.setmConstsUserBean(bean.getData()); mUserApi.loginSign(null, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { try { HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); if (bean.getData().getIsSign()) { CusToast.getInstance(Consts.getmApplicAtion()).show("恭喜签到成功\n奖励" + bean.getData().getCount() + "朵小红花", 2000); } } catch (Exception e) { e.printStackTrace(); } finally { if (!Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) { //不是小度的,检查权限 if (Consts.getmConstsUserBean() != null) { mOrderApi.getAuth(new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { HttpResultBean bean = info.getRetDetail(new TypeToken>() { }.getType()); if (!TextUtils.isEmpty(bean.getData())) { Consts.setIsYFVip(true); } else { Consts.setIsYFVip(false); } //关闭界面 mView.getActivity().finish(); } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("查询权限接口失败"); Consts.setIsYFVip(false); mView.getActivity().finish(); } }); } } } } @Override public void onFailure(HttpInfo info) throws IOException { CusToast.getInstance(Consts.getmApplicAtion()).show("其他错误:" + info.getRetDetail(), 2000); //关闭界面 mView.getActivity().finish(); } }); } else if (object.getString("code").equals("300") || object.getInt("code") == 300) { //暂无数据 Logger.e("暂无数据"); mLoginAlertHandler.sendEmptyMessageDelayed(0x1313, 1000); return; } else { CusToast.getInstance(Consts.getmApplicAtion()).show(object.getString("code"), 2000); mView.getActivity().finish(); } } catch (Exception e) { e.printStackTrace(); Logger.e("onFailure--info.getRetDetail():" + info.getRetDetail()); CusToast.getInstance(Consts.getmApplicAtion()).show(e.getMessage(), 2000); //关闭界面 mView.getActivity().finish(); } finally { } } @Override public void onFailure(HttpInfo info) throws IOException { // CusToast.getInstance(Consts.getmApplicAtion()).show(info.getRetDetail(), 2000); Logger.e("onFailure--info.getRetDetail():" + info.getRetDetail()); //关闭界面 mView.getActivity().finish(); } }); break; } return false; } }); private List getChildIndexFromString(String parent, String child) { int startIndex = 0; List ids = new ArrayList<>(); while (parent.indexOf(child, startIndex) != -1) { //ids.add(startIndex); startIndex = parent.indexOf(child, startIndex); ids.add(startIndex); startIndex = startIndex + child.length(); } return ids; } private void lookPrivacy(int index) { String url = ""; switch (index) { case 0: url = Consts.getAgreementServicesUrl(); break; case 1: url = Consts.getPrivServiceUrl(); break; } Intent intent = new Intent(mView.getActivity(), WebActivity.class); intent.putExtra("loadUrl", url); mView.getActivity().startActivity(intent); } private void setClickListener(View view, Consumer onNext) { RxView.clicks(view).throttleFirst(2, TimeUnit.SECONDS).subscribe(onNext); } }