소스 검색

添加图片验证码

Pq 3 년 전
부모
커밋
c7b3a20b1b
24개의 변경된 파일717개의 추가작업 그리고 62개의 파일을 삭제
  1. 14 1
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java
  2. 120 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/dialog/ImgVerifyCodeDialog.java
  3. BIN
      BaseLibrary/src/main/res/drawable-xxhdpi/ic_cross_circle.png
  4. 5 0
      BaseLibrary/src/main/res/drawable/shape_gray_5dp.xml
  5. 85 0
      BaseLibrary/src/main/res/layout/dialog_img_verify_code_layout.xml
  6. 1 0
      BaseLibrary/src/main/res/values/colors.xml
  7. 11 1
      student/src/main/java/com/cooleshow/student/api/APIService.java
  8. 1 0
      student/src/main/java/com/cooleshow/student/contract/ModifyPasswordContract.java
  9. 3 0
      student/src/main/java/com/cooleshow/student/contract/ModifyPhoneNumContract.java
  10. 35 9
      student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPasswordPresenter.java
  11. 71 2
      student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPhoneNumPresenter.java
  12. 42 8
      student/src/main/java/com/cooleshow/student/ui/mine/ModifyPasswordActivity.java
  13. 72 9
      student/src/main/java/com/cooleshow/student/ui/mine/ModifyPhoneNumActivity.java
  14. 3 2
      student/src/main/java/com/cooleshow/student/ui/mine/NetworkMonitoringActivity.java
  15. 14 2
      teacher/src/main/java/com/cooleshow/teacher/api/APIService.java
  16. 1 0
      teacher/src/main/java/com/cooleshow/teacher/contract/ModifyPasswordContract.java
  17. 3 0
      teacher/src/main/java/com/cooleshow/teacher/contract/ModifyPhoneNumContract.java
  18. 43 5
      teacher/src/main/java/com/cooleshow/teacher/presenter/mine/ModifyPasswordPresenter.java
  19. 69 4
      teacher/src/main/java/com/cooleshow/teacher/presenter/mine/ModifyPhoneNumPresenter.java
  20. 1 1
      teacher/src/main/java/com/cooleshow/teacher/ui/main/MainActivity.java
  21. 10 6
      teacher/src/main/java/com/cooleshow/teacher/ui/mine/InputBankVCodeActivity.java
  22. 44 8
      teacher/src/main/java/com/cooleshow/teacher/ui/mine/ModifyPasswordActivity.java
  23. 66 2
      teacher/src/main/java/com/cooleshow/teacher/ui/mine/ModifyPhoneNumActivity.java
  24. 3 2
      teacher/src/main/java/com/cooleshow/teacher/ui/mine/NetworkMonitoringActivity.java

+ 14 - 1
BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java

@@ -1,21 +1,34 @@
 package com.cooleshow.base.common;
 
 import com.cooleshow.base.BuildConfig;
+import com.tencent.open.im.IM;
 
 /**
  * Author by pq, Date on 2022/4/21.
  */
 public class BaseConstant {
-    public final static String SERVER_ADDRESS= BuildConfig.BASE_SERVER_URL;
+    public final static String SERVER_ADDRESS = BuildConfig.BASE_SERVER_URL;
     public final static String TEACHER_GROUP = "api-teacher/";
     public final static String STUDENT_GROUP = "api-student/";
     public final static String AUTH_GROUP = "api-auth/";
     public final static String MALL_ADMIN_SERVER = "api-mall-admin/";
     public final static String MALL_PORTAL_SERVER = "api-mall-portal/";
     public final static String CMS_SERVER = "api-cms/";
+    public final static String IMAGE_VERIFY_CODE_API_URL = "code/getImageCode?phone=";
 
 
     public final static String TABLE_PREFS = "Kotlin_mall";
     public final static String KEY_SP_TOKEN = "token";
     public final static String STUDENT_ID = "student_id";
+
+    /**
+     * 获取图片验证码地址
+     * @return
+     */
+    public static String getImgCodeApiUrl() {
+        if (BaseApplication.Companion.isTeacherClient()) {
+            return SERVER_ADDRESS+TEACHER_GROUP + IMAGE_VERIFY_CODE_API_URL;
+        }
+        return SERVER_ADDRESS+STUDENT_GROUP + IMAGE_VERIFY_CODE_API_URL;
+    }
 }

+ 120 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/dialog/ImgVerifyCodeDialog.java

@@ -0,0 +1,120 @@
+package com.cooleshow.base.widgets.dialog;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.request.RequestOptions;
+import com.cooleshow.base.BuildConfig;
+import com.cooleshow.base.R;
+import com.cooleshow.base.common.BaseConstant;
+import com.cooleshow.base.utils.LogUtils;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2022/7/5.
+ */
+public class ImgVerifyCodeDialog extends Dialog {
+
+    private ImageView mIvClose;
+    private ImageView mIvIcon;
+    private TextView mTvRefresh;
+    private EditText etCode;
+    private String currentPhone;
+    private TextWatcher mTextWatcher;
+    private OnEventListener mListener;
+
+    public ImgVerifyCodeDialog(@NonNull Context context) {
+        super(context, R.style.DialogStyle);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_img_verify_code_layout);
+        mIvClose = findViewById(R.id.iv_close);
+        mIvIcon = findViewById(R.id.iv_code);
+        mTvRefresh = findViewById(R.id.tv_refresh);
+        etCode = findViewById(R.id.et_code);
+        mIvClose.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                dismiss();
+            }
+        });
+        mTvRefresh.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                loadImg();
+            }
+        });
+        mTextWatcher = new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable editable) {
+                if (mListener != null) {
+                    if (editable.length() == 4) {
+                        mListener.onVerifyImgCode(currentPhone, etCode.getText().toString().trim());
+                    }
+                }
+
+            }
+        };
+        etCode.addTextChangedListener(mTextWatcher);
+    }
+
+    public void setPhone(String phone) {
+        if (mIvIcon != null) {
+            this.currentPhone = phone;
+            loadImg();
+        }
+    }
+
+
+    private void loadImg() {
+        RequestOptions options = new RequestOptions()
+                .skipMemoryCache(true)
+                .diskCacheStrategy(DiskCacheStrategy.NONE);
+        String imgUrl = BaseConstant.getImgCodeApiUrl() + currentPhone;
+        LogUtils.i("pq", "imgUrl:" + imgUrl);
+        Glide.with(getContext()).load(imgUrl).apply(options).into(mIvIcon);
+    }
+
+    public void setOnEventListener(OnEventListener onEventListener) {
+        this.mListener = onEventListener;
+    }
+
+    public interface OnEventListener {
+        void onVerifyImgCode(String phone, String imgCode);
+    }
+
+    public void release() {
+        if (mTextWatcher != null && etCode != null) {
+            etCode.removeTextChangedListener(mTextWatcher);
+        }
+    }
+
+    @Override
+    public void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        release();
+    }
+}

BIN
BaseLibrary/src/main/res/drawable-xxhdpi/ic_cross_circle.png


+ 5 - 0
BaseLibrary/src/main/res/drawable/shape_gray_5dp.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="@color/gray_f4"/>
+    <corners android:radius="5dp"/>
+</shape>

+ 85 - 0
BaseLibrary/src/main/res/layout/dialog_img_verify_code_layout.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <ImageView
+        android:id="@+id/iv_close"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/ic_cross_circle"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="10dp"
+        android:layout_marginTop="@dimen/dp_12"
+        android:layout_marginEnd="10dp"
+        android:background="@drawable/shape_8dp_white"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/iv_close">
+
+        <TextView
+            android:id="@+id/textView"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dp_20"
+            android:text="输入图形验证码"
+            android:textColor="@color/black_444"
+            android:textSize="@dimen/dp_16"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <EditText
+            android:id="@+id/et_code"
+            android:layout_width="@dimen/dp_150"
+            android:layout_height="@dimen/dp_45"
+            android:layout_marginStart="@dimen/dp_14"
+            android:layout_marginTop="@dimen/dp_17"
+            android:background="@drawable/shape_gray_5dp"
+            android:ems="10"
+            android:gravity="center_vertical"
+            android:hint="输入验证码"
+            android:paddingStart="11dp"
+            android:textColor="@color/black_444"
+            android:textColorHint="@color/gray_AA"
+            android:textSize="@dimen/dp_16"
+            app:layout_constraintRight_toLeftOf="@+id/iv_code"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/textView" />
+
+        <ImageView
+            android:id="@+id/iv_code"
+            android:layout_width="@dimen/dp_84"
+            android:layout_height="@dimen/dp_30"
+            android:layout_marginStart="@dimen/dp_4"
+            android:layout_marginEnd="@dimen/dp_10"
+            android:adjustViewBounds="true"
+            android:scaleType="fitXY"
+            app:layout_constraintBottom_toBottomOf="@+id/et_code"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toEndOf="@+id/et_code"
+            app:layout_constraintTop_toTopOf="@+id/et_code" />
+
+        <TextView
+            android:id="@+id/tv_refresh"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="5dp"
+            android:layout_marginBottom="@dimen/dp_19"
+            android:text="看不清?换一换"
+            android:textColor="@color/gray_AA"
+            android:textSize="@dimen/dp_12"
+            app:layout_constraintLeft_toLeftOf="@+id/iv_code"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintEnd_toEndOf="@+id/iv_code"
+            app:layout_constraintTop_toBottomOf="@id/et_code" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 1 - 0
BaseLibrary/src/main/res/values/colors.xml

@@ -21,6 +21,7 @@
     <color name="white">#ffffff</color>
     <color name="gray_EEEFF3">#EEEFF3</color>
     <color name="black_80">#80000000</color>
+    <color name="gray_f4">#F4F4F4</color>
 
     <color name="text_dark">#999999</color>
     <color name="text_light_dark">#333333</color>

+ 11 - 1
student/src/main/java/com/cooleshow/student/api/APIService.java

@@ -153,7 +153,7 @@ public interface APIService {
      * 发送登录短信验证码
      *
      * @param body mobile 手机号
-     *             type:类型(PASSWD:修改密码,LOGIN:登录,REGISTER:注册,BANK:绑定银行卡))
+     *             type:类型(PASSWD:修改密码,LOGIN:登录,REGISTER:注册,BANK:绑定银行卡PHONE:修改手机号))
      * @return
      */
     @POST(STUDENT_GROUP + "code/sendSmsCode")
@@ -465,4 +465,14 @@ public interface APIService {
      */
     @POST(STUDENT_GROUP + "courseSchedule/queryPianoClass")
     Observable<BaseResponse<PianoRoomCourseListBean>> getPianoRoomCourseList(@Body RequestBody body);
+
+    /**
+     * 校验图片验证码
+     *
+     *             type:类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)
+     * @return
+     */
+    @FormUrlEncoded
+    @POST(TEACHER_GROUP + "code/verifyImageCode")
+    Observable<BaseResponse<Object>> verifyImgCode(@FieldMap Map<String, String> map);
 }

+ 1 - 0
student/src/main/java/com/cooleshow/student/contract/ModifyPasswordContract.java

@@ -12,6 +12,7 @@ public interface ModifyPasswordContract {
     interface ModifyPasswordView extends BaseView {
         void updatePasswordSuccess(Object object);
         void sendSmsCodeSuccess(Object object);
+        void verifyImgCodeSuccess(String phone);
     }
 
     interface Presenter {

+ 3 - 0
student/src/main/java/com/cooleshow/student/contract/ModifyPhoneNumContract.java

@@ -1,6 +1,7 @@
 package com.cooleshow.student.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.usercenter.bean.SetDetailBean;
 
 /**
  * 创建日期:2022/5/17 10:57
@@ -11,6 +12,8 @@ import com.cooleshow.base.presenter.view.BaseView;
 public interface ModifyPhoneNumContract {
     interface ModifyPhoneNumView extends BaseView {
         void updatePhoneSuccess(Object object);
+        void verifyImgCodeSuccess(String phone);
+        void sendSmsCodeSuccess(SetDetailBean setDetailBean);
     }
 
     interface Presenter {

+ 35 - 9
student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPasswordPresenter.java

@@ -11,6 +11,7 @@ import com.cooleshow.student.api.APIService;
 import com.cooleshow.student.contract.ModifyPasswordContract;
 import com.cooleshow.usercenter.bean.SetDetailBean;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -38,11 +39,6 @@ public class ModifyPasswordPresenter extends BasePresenter<ModifyPasswordContrac
             @Override
             public void onError(Throwable e) {
                 super.onError(e);
-                if (e instanceof ApiException) {
-                    ErrorParse.getInstance().parseError(e);
-                    ApiException apiException = (ApiException) e;
-                    ToastUtil.getInstance().showShort(apiException.getErrmsg());
-                }
             }
         });
 
@@ -65,12 +61,42 @@ public class ModifyPasswordPresenter extends BasePresenter<ModifyPasswordContrac
             @Override
             public void onError(Throwable e) {
                 super.onError(e);
-                if (e instanceof ApiException) {
-                    ErrorParse.getInstance().parseError(e);
-                    ApiException apiException = (ApiException) e;
-                    ToastUtil.getInstance().showShort(apiException.getErrmsg());
+            }
+        });
+    }
+
+    /**
+     * 图片验证码验证
+     * @param phone
+     * @param imgCode
+     */
+    public void verifyImgCode(String phone, String imgCode) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        Map<String, String> params = new HashMap<>();
+        params.put("code", imgCode);
+        params.put("phone", phone);
+        addSubscribe(create(APIService.class).verifyImgCode(params), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().verifyImgCodeSuccess(phone);
                 }
             }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
         });
     }
 }

+ 71 - 2
student/src/main/java/com/cooleshow/student/presenter/mine/ModifyPhoneNumPresenter.java

@@ -3,11 +3,16 @@ package com.cooleshow.student.presenter.mine;
 import com.cooleshow.base.data.net.ApiException;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
 import com.cooleshow.base.utils.ErrorParse;
 import com.cooleshow.student.api.APIService;
 import com.cooleshow.student.contract.ModifyPhoneNumContract;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 创建日期:2022/5/17 10:56
@@ -16,9 +21,9 @@ import com.cooleshow.student.contract.ModifyPhoneNumContract;
  * 类说明:
  */
 public class ModifyPhoneNumPresenter extends BasePresenter<ModifyPhoneNumContract.ModifyPhoneNumView> implements ModifyPhoneNumContract.Presenter {
-    public void updatePhone(String authCode,String newPhone, String oldPhone) {
+    public void updatePhone(String authCode, String newPhone, String oldPhone) {
         getView().showLoading();
-        addSubscribe(create(APIService.class).updatePhone(authCode, newPhone,oldPhone), new BaseObserver<Object>(getView()) {
+        addSubscribe(create(APIService.class).updatePhone(authCode, newPhone, oldPhone), new BaseObserver<Object>(getView()) {
             @Override
             protected void onSuccess(Object data) {
                 if (getView() != null) {
@@ -31,6 +36,7 @@ public class ModifyPhoneNumPresenter extends BasePresenter<ModifyPhoneNumContrac
                 super.onComplete();
                 getView().hideLoading();
             }
+
             @Override
             public void onError(Throwable e) {
                 super.onError(e);
@@ -42,4 +48,67 @@ public class ModifyPhoneNumPresenter extends BasePresenter<ModifyPhoneNumContrac
             }
         });
     }
+
+    /**
+     * 图片验证码验证
+     *
+     * @param phone
+     * @param imgCode
+     */
+    public void verifyImgCode(String phone, String imgCode) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        Map<String, String> params = new HashMap<>();
+        params.put("code", imgCode);
+        params.put("phone", phone);
+        addSubscribe(create(APIService.class).verifyImgCode(params), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().verifyImgCodeSuccess(phone);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
+        });
+    }
+
+    public void sendSmsCode(String jsonStr) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        addSubscribe(create(APIService.class).sendSmsCode(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().sendSmsCodeSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
+        });
+    }
 }

+ 42 - 8
student/src/main/java/com/cooleshow/student/ui/mine/ModifyPasswordActivity.java

@@ -17,6 +17,7 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.widgets.dialog.ImgVerifyCodeDialog;
 import com.cooleshow.student.R;
 import com.cooleshow.student.contract.ModifyPasswordContract;
 import com.cooleshow.student.databinding.ActivityModifyPasswordBinding;
@@ -43,6 +44,9 @@ import io.rong.imkit.utils.StatusBarUtil;
  */
 @Route(path = RouterPath.MineCenter.MINE_MODIFY_PASSWORD)
 public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswordBinding, ModifyPasswordPresenter> implements ModifyPasswordContract.ModifyPasswordView, View.OnClickListener {
+
+    private ImgVerifyCodeDialog mImgVerifyCodeDialog;
+
     @Override
     public void onClick(View view) {
         switch (view.getId()) {
@@ -64,14 +68,7 @@ public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswo
                 presenter.updatePassword(params);
                 break;
             case R.id.tv_get_auth_code:
-                JSONObject jsonObject = new JSONObject();
-                try {
-                    jsonObject.putOpt("mobile", phoneNum);
-                    jsonObject.putOpt("type", "PASSWD");
-                } catch (JSONException e) {
-                    e.printStackTrace();
-                }
-                presenter.sendSmsCode(jsonObject.toString());
+                showImgVerifyCodeDialog();
                 break;
         }
     }
@@ -95,6 +92,25 @@ public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswo
         viewBinding.tvPhone.setText(cPhone);
     }
 
+
+    private void showImgVerifyCodeDialog() {
+        if (mImgVerifyCodeDialog == null) {
+            mImgVerifyCodeDialog = new ImgVerifyCodeDialog(ModifyPasswordActivity.this);
+        }
+        if (!mImgVerifyCodeDialog.isShowing()) {
+            mImgVerifyCodeDialog.show();
+        }
+        mImgVerifyCodeDialog.setPhone(phoneNum);
+        mImgVerifyCodeDialog.setOnEventListener(new ImgVerifyCodeDialog.OnEventListener() {
+            @Override
+            public void onVerifyImgCode(String phone, String imgCode) {
+                if (presenter != null) {
+                    presenter.verifyImgCode(phone, imgCode);
+                }
+            }
+        });
+    }
+
     @Override
     protected ActivityModifyPasswordBinding getLayoutView() {
         return ActivityModifyPasswordBinding.inflate(getLayoutInflater());
@@ -120,6 +136,24 @@ public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswo
         getCodeSuccess();
     }
 
+    @Override
+    public void verifyImgCodeSuccess(String phone) {
+        if (isFinishing() || isDestroyed()) {
+            return;
+        }
+        if (mImgVerifyCodeDialog != null) {
+            mImgVerifyCodeDialog.dismiss();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("mobile", phone);
+            jsonObject.putOpt("type", "PASSWD");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        presenter.sendSmsCode(jsonObject.toString());
+    }
+
 
     public void getCodeSuccess() {
         ToastUtil.getInstance().showShort("验证码发送成功,请注意查收!");

+ 72 - 9
student/src/main/java/com/cooleshow/student/ui/mine/ModifyPhoneNumActivity.java

@@ -17,12 +17,17 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.widgets.dialog.ImgVerifyCodeDialog;
 import com.cooleshow.student.R;
 import com.cooleshow.student.contract.ModifyPhoneNumContract;
 import com.cooleshow.student.databinding.ActivityModifyPhonenumBinding;
 import com.cooleshow.student.presenter.mine.ModifyPhoneNumPresenter;
+import com.cooleshow.usercenter.bean.SetDetailBean;
 
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -36,34 +41,45 @@ import io.rong.imkit.utils.StatusBarUtil;
  */
 @Route(path = RouterPath.MineCenter.MINE_MODIFY_PHONENUM)
 public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonenumBinding, ModifyPhoneNumPresenter> implements ModifyPhoneNumContract.ModifyPhoneNumView, View.OnClickListener {
+
+    private ImgVerifyCodeDialog mImgVerifyCodeDialog;
+
     @Override
     public void onClick(View view) {
-        switch (view.getId()){
+        switch (view.getId()) {
             case R.id.tv_get_auth_code:
-                getCodeSuccess();
+                String phone = viewBinding.etPhoneNum.getText().toString().trim();
+                if (TextUtils.isEmpty(phone)) {
+                    ToastUtil.getInstance().showShort("请输入手机号");
+                    break;
+                }
+                showImgVerifyCodeDialog(phone);
                 break;
             case R.id.tv_save:
                 String phoneNum = viewBinding.etPhoneNum.getText().toString().trim();
-                if (TextUtils.isEmpty(phoneNum)){
+                if (TextUtils.isEmpty(phoneNum)) {
                     ToastUtil.getInstance().showShort("请输入手机号");
                     break;
                 }
                 String authCode = viewBinding.etAuthCode.getText().toString().trim();
-                if (TextUtils.isEmpty(authCode)){
+                if (TextUtils.isEmpty(authCode)) {
                     ToastUtil.getInstance().showShort("请输入验证码");
                     break;
                 }
-                presenter.updatePhone(oldPhone,phoneNum,authCode);
+                presenter.updatePhone(oldPhone, phoneNum, authCode);
                 break;
         }
     }
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         StatusBarUtil.setStatusBarDarkTheme(this, true);
     }
+
     @Autowired(name = "oldPhone")
     String oldPhone;
+
     @Override
     protected void initView() {
         ARouter.getInstance().inject(this);
@@ -72,6 +88,24 @@ public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonen
         viewBinding.tvSave.setOnClickListener(this);
     }
 
+    private void showImgVerifyCodeDialog(String phone) {
+        if (mImgVerifyCodeDialog == null) {
+            mImgVerifyCodeDialog = new ImgVerifyCodeDialog(ModifyPhoneNumActivity.this);
+        }
+        if (!mImgVerifyCodeDialog.isShowing()) {
+            mImgVerifyCodeDialog.show();
+        }
+        mImgVerifyCodeDialog.setPhone(phone);
+        mImgVerifyCodeDialog.setOnEventListener(new ImgVerifyCodeDialog.OnEventListener() {
+            @Override
+            public void onVerifyImgCode(String phone, String imgCode) {
+                if (presenter != null) {
+                    presenter.verifyImgCode(phone, imgCode);
+                }
+            }
+        });
+    }
+
     @Override
     protected ActivityModifyPhonenumBinding getLayoutView() {
         return ActivityModifyPhonenumBinding.inflate(getLayoutInflater());
@@ -84,12 +118,39 @@ public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonen
 
     @Override
     public void updatePhoneSuccess(Object object) {
-        Intent intent=new Intent();
-        intent.putExtra("newPhoneNum",viewBinding.etPhoneNum.getText().toString().trim());
-        setResult(RESULT_OK,intent);
+        Intent intent = new Intent();
+        intent.putExtra("newPhoneNum", viewBinding.etPhoneNum.getText().toString().trim());
+        setResult(RESULT_OK, intent);
         finish();
     }
 
+    @Override
+    public void verifyImgCodeSuccess(String phone) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        if (mImgVerifyCodeDialog != null) {
+            mImgVerifyCodeDialog.dismiss();
+        }
+        sendSmsCode(phone);
+    }
+
+    @Override
+    public void sendSmsCodeSuccess(SetDetailBean setDetailBean) {
+        getCodeSuccess();
+    }
+
+    private void sendSmsCode(String phone) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("mobile", phone);
+            jsonObject.putOpt("type", "PHONE");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        presenter.sendSmsCode(jsonObject.toString());
+    }
+
     public void getCodeSuccess() {
         ToastUtil.getInstance().showShort("验证码发送成功,请注意查收!");
         startTimer();
@@ -169,6 +230,8 @@ public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonen
     @Override
     public void onDestroy() {
         super.onDestroy();
-        handler.removeCallbacksAndMessages(EXECUTE_LOADING);
+        if (handler != null) {
+            handler.removeCallbacksAndMessages(null);
+        }
     }
 }

+ 3 - 2
student/src/main/java/com/cooleshow/student/ui/mine/NetworkMonitoringActivity.java

@@ -353,7 +353,8 @@ public class NetworkMonitoringActivity extends BaseMVPActivity<ActivityNetworkMo
     @Override
     public void onDestroy() {
         super.onDestroy();
-        mHandler.removeCallbacks(mRunnable);
-        mHandler.removeCallbacksAndMessages(mRunnable);
+        if (mHandler != null) {
+            mHandler.removeCallbacksAndMessages(null);
+        }
     }
 }

+ 14 - 2
teacher/src/main/java/com/cooleshow/teacher/api/APIService.java

@@ -114,6 +114,7 @@ public interface APIService {
      */
     @POST(TEACHER_GROUP + "courseSchedule/queryTeacherPracticeCourse")
     Observable<BaseResponse<SparringCourseListBean>> getSparringCourses(@Body TeacherPracticeCourseEntry body);
+
     /**
      * 获取声部搜索下拉框
      *
@@ -133,6 +134,7 @@ public interface APIService {
 
     /**
      * 获取直播课信息
+     *
      * @return
      */
     @GET(TEACHER_GROUP + "courseSchedule/queryLiveAndVideo")
@@ -388,6 +390,16 @@ public interface APIService {
     Observable<BaseResponse<Object>> sendSmsCode(@Body RequestBody body);
 
     /**
+     * 校验图片验证码
+     *
+     *             type:类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)
+     * @return
+     */
+    @FormUrlEncoded
+    @POST(TEACHER_GROUP + "code/verifyImageCode")
+    Observable<BaseResponse<Object>> verifyImgCode(@FieldMap Map<String, String> map);
+
+    /**
      * 校验短信验证码
      *
      * @param body mobile 手机号
@@ -670,7 +682,7 @@ public interface APIService {
      *
      * @return
      */
-    @POST(TEACHER_GROUP+"liveRoom/syncUserStatus")
+    @POST(TEACHER_GROUP + "liveRoom/syncUserStatus")
     Observable<BaseResponse<Object>> notifyLeaveRoomAction(@Body RequestBody body);
 
     /**
@@ -679,7 +691,7 @@ public interface APIService {
      * @return type 1:开始直播-开始录像 2:关闭直播关闭录像
      */
     @GET(TEACHER_GROUP + "imLiveBroadcastRoom/opsLiveVideo")
-    Observable<BaseResponse<Object>> notifyOpenOpsLiveVideoAction(@Query("roomUid") String roomUid, @Query("type") String type, @Query("userId") String userId,@Query("videoResolution") String videoResolution);
+    Observable<BaseResponse<Object>> notifyOpenOpsLiveVideoAction(@Query("roomUid") String roomUid, @Query("type") String type, @Query("userId") String userId, @Query("videoResolution") String videoResolution);
 
     /**
      * 关闭直播间

+ 1 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/ModifyPasswordContract.java

@@ -12,6 +12,7 @@ public interface ModifyPasswordContract {
     interface ModifyPasswordView extends BaseView {
         void updatePasswordSuccess(Object object);
         void sendSmsCodeSuccess(Object object);
+        void verifyImgCodeSuccess(String phone);
     }
 
     interface Presenter {

+ 3 - 0
teacher/src/main/java/com/cooleshow/teacher/contract/ModifyPhoneNumContract.java

@@ -1,6 +1,7 @@
 package com.cooleshow.teacher.contract;
 
 import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.usercenter.bean.SetDetailBean;
 
 /**
  * 创建日期:2022/5/17 10:57
@@ -11,6 +12,8 @@ import com.cooleshow.base.presenter.view.BaseView;
 public interface ModifyPhoneNumContract {
     interface ModifyPhoneNumView extends BaseView {
         void updatePhoneSuccess(Object object);
+        void verifyImgCodeSuccess(String phone);
+        void sendSmsCodeSuccess(SetDetailBean setDetailBean);
     }
 
     interface Presenter {

+ 43 - 5
teacher/src/main/java/com/cooleshow/teacher/presenter/mine/ModifyPasswordPresenter.java

@@ -11,6 +11,10 @@ import com.cooleshow.teacher.api.APIService;
 import com.cooleshow.teacher.contract.ModifyPasswordContract;
 import com.cooleshow.usercenter.bean.SetDetailBean;
 
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -35,6 +39,7 @@ public class ModifyPasswordPresenter extends BasePresenter<ModifyPasswordContrac
                 super.onComplete();
                 getView().hideLoading();
             }
+
             @Override
             public void onError(Throwable e) {
                 super.onError(e);
@@ -47,7 +52,8 @@ public class ModifyPasswordPresenter extends BasePresenter<ModifyPasswordContrac
         });
 
     }
-    public void sendSmsCode(String jsonStr){
+
+    public void sendSmsCode(String jsonStr) {
         getView().showLoading();
         addSubscribe(create(APIService.class).sendSmsCode(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
             @Override
@@ -62,15 +68,47 @@ public class ModifyPasswordPresenter extends BasePresenter<ModifyPasswordContrac
                 super.onComplete();
                 getView().hideLoading();
             }
+
             @Override
             public void onError(Throwable e) {
                 super.onError(e);
-                if (e instanceof ApiException) {
-                    ErrorParse.getInstance().parseError(e);
-                    ApiException apiException = (ApiException) e;
-                    ToastUtil.getInstance().showShort(apiException.getErrmsg());
+            }
+        });
+    }
+
+
+    /**
+     * 图片验证码验证
+     * @param phone
+     * @param imgCode
+     */
+    public void verifyImgCode(String phone, String imgCode) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        Map<String, String> params = new HashMap<>();
+        params.put("code", imgCode);
+        params.put("phone", phone);
+        addSubscribe(create(APIService.class).verifyImgCode(params), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().verifyImgCodeSuccess(phone);
                 }
             }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
         });
     }
 }

+ 69 - 4
teacher/src/main/java/com/cooleshow/teacher/presenter/mine/ModifyPhoneNumPresenter.java

@@ -3,11 +3,16 @@ package com.cooleshow.teacher.presenter.mine;
 import com.cooleshow.base.data.net.ApiException;
 import com.cooleshow.base.presenter.BasePresenter;
 import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
 import com.cooleshow.base.utils.ErrorParse;
 import com.cooleshow.teacher.api.APIService;
 import com.cooleshow.teacher.contract.ModifyPhoneNumContract;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 创建日期:2022/5/17 10:56
@@ -34,12 +39,72 @@ public class ModifyPhoneNumPresenter extends BasePresenter<ModifyPhoneNumContrac
             @Override
             public void onError(Throwable e) {
                 super.onError(e);
-                if (e instanceof ApiException) {
-                    ErrorParse.getInstance().parseError(e);
-                    ApiException apiException = (ApiException) e;
-                    ToastUtil.getInstance().showShort(apiException.getErrmsg());
+            }
+        });
+    }
+
+
+    /**
+     * 图片验证码验证
+     *
+     * @param phone
+     * @param imgCode
+     */
+    public void verifyImgCode(String phone, String imgCode) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        Map<String, String> params = new HashMap<>();
+        params.put("code", imgCode);
+        params.put("phone", phone);
+        addSubscribe(create(APIService.class).verifyImgCode(params), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().verifyImgCodeSuccess(phone);
                 }
             }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
+        });
+    }
+
+
+    public void sendSmsCode(String jsonStr) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        addSubscribe(create(APIService.class).sendSmsCode(RequestBodyUtil.convertToRequestBodyJson(jsonStr)), new BaseObserver<SetDetailBean>(getView()) {
+            @Override
+            protected void onSuccess(SetDetailBean data) {
+                if (getView() != null) {
+                    getView().sendSmsCodeSuccess(data);
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                super.onError(e);
+            }
         });
     }
 }

+ 1 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/main/MainActivity.java

@@ -83,7 +83,7 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
-        parseIntent(getIntent());
+        parseIntent(intent);
     }
 
     private void parseIntent(Intent intent) {

+ 10 - 6
teacher/src/main/java/com/cooleshow/teacher/ui/mine/InputBankVCodeActivity.java

@@ -39,7 +39,7 @@ public class InputBankVCodeActivity extends BaseMVPActivity<ActivityInputBankVco
 
     @Override
     public void onClick(View view) {
-        switch (view.getId()){
+        switch (view.getId()) {
             case R.id.tv_resend_code:
                 //跳绑卡成功
                 ARouter.getInstance().build(RouterPath.MineCenter.MINE_BIND_CARD_SUCCESS)
@@ -54,7 +54,7 @@ public class InputBankVCodeActivity extends BaseMVPActivity<ActivityInputBankVco
         sendVcode();
     }
 
-    private void sendVcode(){
+    private void sendVcode() {
         JSONObject jsonObject = new JSONObject();
         try {
             jsonObject.putOpt("mobile", phone);
@@ -70,20 +70,22 @@ public class InputBankVCodeActivity extends BaseMVPActivity<ActivityInputBankVco
         super.onCreate(savedInstanceState);
         StatusBarUtil.setStatusBarDarkTheme(this, true);
     }
+
     private String jsonString;
     private String phone;
+
     @Override
     protected void initView() {
         initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "");
         viewBinding.tvResendCode.setOnClickListener(this);
-        jsonString=getIntent().getStringExtra("jsonString");
-        phone=getIntent().getStringExtra("phone");
+        jsonString = getIntent().getStringExtra("jsonString");
+        phone = getIntent().getStringExtra("phone");
         viewBinding.tvPhoneNum.setText(phone);
         viewBinding.editCode.addInputCompleteListener(new VerifyEditText.InputCompleteListener() {
             @Override
             public void complete(String content) {
                 //输入完成
-                presenter.verifySmsCode(phone,"BANK",content);
+                presenter.verifySmsCode(phone, "BANK", content);
             }
         });
     }
@@ -195,6 +197,8 @@ public class InputBankVCodeActivity extends BaseMVPActivity<ActivityInputBankVco
     @Override
     public void onDestroy() {
         super.onDestroy();
-        handler.removeCallbacksAndMessages(EXECUTE_LOADING);
+        if (handler != null) {
+            handler.removeCallbacksAndMessages(null);
+        }
     }
 }

+ 44 - 8
teacher/src/main/java/com/cooleshow/teacher/ui/mine/ModifyPasswordActivity.java

@@ -17,6 +17,7 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.widgets.dialog.ImgVerifyCodeDialog;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.contract.ModifyPasswordContract;
 import com.cooleshow.teacher.databinding.ActivityModifyPasswordBinding;
@@ -49,6 +50,7 @@ import io.rong.imkit.utils.StatusBarUtil;
 @Route(path = RouterPath.MineCenter.MINE_MODIFY_PASSWORD)
 public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswordBinding, ModifyPasswordPresenter> implements ModifyPasswordContract.ModifyPasswordView, View.OnClickListener {
     private Disposable disposable;
+    private ImgVerifyCodeDialog mImgVerifyCodeDialog;
 
     @Override
     public void onClick(View view) {
@@ -72,18 +74,40 @@ public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswo
                 presenter.updatePassword(params);
                 break;
             case R.id.tv_get_auth_code:
-                JSONObject jsonObject = new JSONObject();
-                try {
-                    jsonObject.putOpt("mobile", phoneNum);
-                    jsonObject.putOpt("type", "PASSWD");
-                } catch (JSONException e) {
-                    e.printStackTrace();
-                }
-                presenter.sendSmsCode(jsonObject.toString());
+                showImgVerifyCodeDialog();
                 break;
         }
     }
 
+    private void showImgVerifyCodeDialog() {
+        if (mImgVerifyCodeDialog == null) {
+            mImgVerifyCodeDialog = new ImgVerifyCodeDialog(ModifyPasswordActivity.this);
+        }
+        if (!mImgVerifyCodeDialog.isShowing()) {
+            mImgVerifyCodeDialog.show();
+        }
+        mImgVerifyCodeDialog.setPhone(phoneNum);
+        mImgVerifyCodeDialog.setOnEventListener(new ImgVerifyCodeDialog.OnEventListener() {
+            @Override
+            public void onVerifyImgCode(String phone, String imgCode) {
+                if (presenter != null) {
+                    presenter.verifyImgCode(phone, imgCode);
+                }
+            }
+        });
+    }
+
+    private void sendVerifyCode(String phone) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("mobile", phone);
+            jsonObject.putOpt("type", "PASSWD");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        presenter.sendSmsCode(jsonObject.toString());
+    }
+
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -130,12 +154,24 @@ public class ModifyPasswordActivity extends BaseMVPActivity<ActivityModifyPasswo
         getCodeSuccess();
     }
 
+    @Override
+    public void verifyImgCodeSuccess(String phone) {
+        if (isFinishing() || isDestroyed()) {
+            return;
+        }
+        if (mImgVerifyCodeDialog != null) {
+            mImgVerifyCodeDialog.dismiss();
+        }
+        sendVerifyCode(phone);
+    }
+
 
     public void getCodeSuccess() {
         ToastUtil.getInstance().showShort("验证码发送成功,请注意查收!");
         startTimer();
 
     }
+
     /**
      * 开始倒计时
      */

+ 66 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/mine/ModifyPhoneNumActivity.java

@@ -17,10 +17,15 @@ import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.ToastUtils;
+import com.cooleshow.base.widgets.dialog.ImgVerifyCodeDialog;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.contract.ModifyPhoneNumContract;
 import com.cooleshow.teacher.databinding.ActivityModifyPhonenumBinding;
 import com.cooleshow.teacher.presenter.mine.ModifyPhoneNumPresenter;
+import com.cooleshow.usercenter.bean.SetDetailBean;
+
+import org.json.JSONException;
+import org.json.JSONObject;
 
 import java.util.Timer;
 import java.util.TimerTask;
@@ -35,11 +40,19 @@ import io.rong.imkit.utils.StatusBarUtil;
  */
 @Route(path = RouterPath.MineCenter.MINE_MODIFY_PHONENUM)
 public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonenumBinding, ModifyPhoneNumPresenter> implements ModifyPhoneNumContract.ModifyPhoneNumView, View.OnClickListener {
+
+    private ImgVerifyCodeDialog mImgVerifyCodeDialog;
+
     @Override
     public void onClick(View view) {
         switch (view.getId()){
             case R.id.tv_get_auth_code:
-                getCodeSuccess();
+                String phone = viewBinding.etPhoneNum.getText().toString().trim();
+                if (TextUtils.isEmpty(phone)) {
+                    ToastUtil.getInstance().showShort("请输入手机号");
+                    break;
+                }
+                showImgVerifyCodeDialog(phone);
                 break;
             case R.id.tv_save:
                 String phoneNum = viewBinding.etPhoneNum.getText().toString().trim();
@@ -71,6 +84,25 @@ public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonen
         viewBinding.tvSave.setOnClickListener(this);
     }
 
+
+    private void showImgVerifyCodeDialog(String phone) {
+        if (mImgVerifyCodeDialog == null) {
+            mImgVerifyCodeDialog = new ImgVerifyCodeDialog(ModifyPhoneNumActivity.this);
+        }
+        if (!mImgVerifyCodeDialog.isShowing()) {
+            mImgVerifyCodeDialog.show();
+        }
+        mImgVerifyCodeDialog.setPhone(phone);
+        mImgVerifyCodeDialog.setOnEventListener(new ImgVerifyCodeDialog.OnEventListener() {
+            @Override
+            public void onVerifyImgCode(String phone, String imgCode) {
+                if (presenter != null) {
+                    presenter.verifyImgCode(phone, imgCode);
+                }
+            }
+        });
+    }
+
     @Override
     protected ActivityModifyPhonenumBinding getLayoutView() {
         return ActivityModifyPhonenumBinding.inflate(getLayoutInflater());
@@ -89,6 +121,36 @@ public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonen
         finish();
     }
 
+    @Override
+    public void verifyImgCodeSuccess(String phone) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        if (mImgVerifyCodeDialog != null) {
+            mImgVerifyCodeDialog.dismiss();
+        }
+        sendSmsCode(phone);
+    }
+
+    private void sendSmsCode(String phone) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            jsonObject.putOpt("mobile", phone);
+            jsonObject.putOpt("type", "PHONE");
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+        presenter.sendSmsCode(jsonObject.toString());
+    }
+
+    @Override
+    public void sendSmsCodeSuccess(SetDetailBean setDetailBean) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        getCodeSuccess();
+    }
+
     public void getCodeSuccess() {
         ToastUtil.getInstance().showShort("验证码发送成功,请注意查收!");
         startTimer();
@@ -168,6 +230,8 @@ public class ModifyPhoneNumActivity extends BaseMVPActivity<ActivityModifyPhonen
     @Override
     public void onDestroy() {
         super.onDestroy();
-        handler.removeCallbacksAndMessages(EXECUTE_LOADING);
+        if (handler != null) {
+            handler.removeCallbacksAndMessages(null);
+        }
     }
 }

+ 3 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/mine/NetworkMonitoringActivity.java

@@ -353,7 +353,8 @@ public class NetworkMonitoringActivity extends BaseMVPActivity<ActivityNetworkMo
     @Override
     public void onDestroy() {
         super.onDestroy();
-        mHandler.removeCallbacks(mRunnable);
-        mHandler.removeCallbacksAndMessages(mRunnable);
+        if (mHandler != null) {
+            mHandler.removeCallbacksAndMessages(null);
+        }
     }
 }