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.TextView; import android.widget.Toast; import com.edufound.reader.activity.WebActivity; import com.edufound.reader.apiserver.UserApiServerImpl; import com.edufound.reader.base.BasePresenter; import com.edufound.reader.contract.LoginAlertContract; 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.google.gson.Gson; import com.jakewharton.rxbinding4.view.RxView; import com.okhttplib.HttpInfo; import com.okhttplib.callback.Callback; import com.orhanobut.logger.Logger; 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; public LoginAlertPresenter() { mModel = new LoginAlertModel(); mUserApi = new UserApiServerImpl(); } @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) { setClickListener(widget, o -> { 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)); mView.getVCodeText().setText(String.valueOf(mVCodeResCount)); mLoginAlertHandler.sendEmptyMessageDelayed(LoginAlertModel.CHANGE_VCODE_TEXT, 1000); mModel.getVCode(mView.getActivity(), phoneNum, new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { String result = info.getRetDetail(); getVCode = 9999; } @Override public void onFailure(HttpInfo info) throws IOException { } }); } 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.getCheckBox().isChecked()) { Toast.makeText(mView.getActivity(), "请勾选用户隐私政策和服务协议", Toast.LENGTH_SHORT).show(); return; } if (Integer.valueOf(inputVCode) == getVCode) { //输入的和返回的是一样的 //请求接口,根据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("verify", "true"); mUserApi.registerUser(mView.getActivity(), new Gson().toJson(params), new Callback() { @Override public void onSuccess(HttpInfo info) throws IOException { Logger.e("注册成功:" + info.getRetDetail()); } @Override public void onFailure(HttpInfo info) throws IOException { Logger.e("注册失败:" + info.getRetDetail()); } }); } 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 = null; } 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; } 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); } }