Jelajahi Sumber

增加扫一扫功能

Pq 3 tahun lalu
induk
melakukan
c5986a72a3
30 mengubah file dengan 610 tambahan dan 38 penghapusan
  1. 1 0
      BaseLibrary/build.gradle
  2. 5 0
      BaseLibrary/src/main/AndroidManifest.xml
  3. 19 0
      BaseLibrary/src/main/java/com/cooleshow/base/constanst/ScanContract.java
  4. 11 0
      BaseLibrary/src/main/java/com/cooleshow/base/data/api/UploadApi.java
  5. 3 11
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/AddressListPresenter.java
  6. 6 12
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/EditAddressPresenter.java
  7. 46 0
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/ScanPresenter.java
  8. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  9. 183 0
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/scan/ScanActivity.java
  10. 1 1
      BaseLibrary/src/main/java/com/cooleshow/base/utils/UiUtils.java
  11. 194 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/GlideEngine.java
  12. TEMPAT SAMPAH
      BaseLibrary/src/main/res/drawable-xhdpi/icon_scan.png
  13. TEMPAT SAMPAH
      BaseLibrary/src/main/res/drawable-xhdpi/icon_scan_by_photo_album.png
  14. TEMPAT SAMPAH
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_scan.png
  15. TEMPAT SAMPAH
      BaseLibrary/src/main/res/drawable-xxhdpi/icon_scan_by_photo_album.png
  16. 23 0
      BaseLibrary/src/main/res/layout/activity_scan_layout.xml
  17. 37 0
      BaseLibrary/src/main/res/layout/my_camera.xml
  18. 3 0
      student/src/main/java/com/cooleshow/student/App.java
  19. 7 1
      student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java
  20. 5 1
      student/src/main/java/com/cooleshow/student/ui/message/MessageBoxActivity.java
  21. TEMPAT SAMPAH
      student/src/main/res/drawable-xhdpi/icon_setting.png
  22. TEMPAT SAMPAH
      student/src/main/res/drawable-xxhdpi/icon_setting.png
  23. 13 1
      student/src/main/res/layout/fragment_mine_layout.xml
  24. 3 0
      teacher/src/main/java/com/cooleshow/teacher/App.java
  25. 7 1
      teacher/src/main/java/com/cooleshow/teacher/ui/main/HomeFragment.kt
  26. 4 0
      teacher/src/main/java/com/cooleshow/teacher/ui/message/MessageBoxActivity.java
  27. TEMPAT SAMPAH
      teacher/src/main/res/drawable-xhdpi/icon_setting.png
  28. TEMPAT SAMPAH
      teacher/src/main/res/drawable-xxhdpi/icon_setting.png
  29. 25 10
      teacher/src/main/res/layout/fragment_home_layout.xml
  30. 13 0
      teacher/src/main/res/layout/fragment_mine_layout.xml

+ 1 - 0
BaseLibrary/build.gradle

@@ -182,6 +182,7 @@ dependencies {
     api project(path: ':midiplaylib')
     api 'org.greenrobot:eventbus:3.1.1'
 
+    api 'cn.yipianfengye.android:zxing-library:2.2'
     //UI适配
 //    api 'me.jessyan:autosize:1.2.1'
 }

+ 5 - 0
BaseLibrary/src/main/AndroidManifest.xml

@@ -28,5 +28,10 @@
             android:name="com.cooleshow.base.ui.activity.set.EditAddressActivity"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:screenOrientation="portrait" />
+
+        <activity
+            android:name="com.cooleshow.base.ui.activity.scan.ScanActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
     </application>
 </manifest>

+ 19 - 0
BaseLibrary/src/main/java/com/cooleshow/base/constanst/ScanContract.java

@@ -0,0 +1,19 @@
+package com.cooleshow.base.constanst;
+
+import com.cooleshow.base.bean.AddressBean;
+import com.cooleshow.base.presenter.view.BaseView;
+
+import java.util.List;
+
+/**
+ * 创建日期:2022/5/17 15:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public interface ScanContract {
+    interface ScanView extends BaseView {
+    }
+    interface Presenter {
+    }
+}

+ 11 - 0
BaseLibrary/src/main/java/com/cooleshow/base/data/api/UploadApi.java

@@ -13,7 +13,9 @@ import retrofit2.http.Body;
 import retrofit2.http.GET;
 import retrofit2.http.POST;
 import retrofit2.http.Path;
+import retrofit2.http.Query;
 
+import static com.cooleshow.base.common.BaseConstant.AUTH_GROUP;
 import static com.cooleshow.base.common.BaseConstant.MALL_PORTAL_SERVER;
 import static com.cooleshow.base.common.BaseConstant.TEACHER_GROUP;
 import static com.cooleshow.base.common.BaseConstant.STUDENT_GROUP;
@@ -75,4 +77,13 @@ public interface UploadApi {
      */
     @POST(MALL_PORTAL_SERVER + "member/address/delete/{id}")
     Observable<BaseResponse<Object>> delAddress(@Path("id") int id);
+
+    /**
+     * 删除地址
+     *
+     * @param code
+     * @return
+     */
+    @GET(AUTH_GROUP + "/doQrLogin")
+    Observable<BaseResponse<Object>> doQrLogin(@Query("code") String code);
 }

+ 3 - 11
BaseLibrary/src/main/java/com/cooleshow/base/presenter/AddressListPresenter.java

@@ -33,16 +33,13 @@ public class AddressListPresenter extends BasePresenter<AddressListContract.Addr
             @Override
             public void onComplete() {
                 super.onComplete();
-                getView().hideLoading();
+                if (getView() != null) {
+                    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());
-                }
             }
         });
     }
@@ -65,11 +62,6 @@ public class AddressListPresenter extends BasePresenter<AddressListContract.Addr
             @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());
-                }
             }
         });
     }

+ 6 - 12
BaseLibrary/src/main/java/com/cooleshow/base/presenter/EditAddressPresenter.java

@@ -33,17 +33,14 @@ public class EditAddressPresenter extends BasePresenter<EditAddressContract.Edit
             @Override
             public void onComplete() {
                 super.onComplete();
-                getView().hideLoading();
+                if (getView() != null) {
+                    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());
-                }
             }
         });
     }
@@ -61,17 +58,14 @@ public class EditAddressPresenter extends BasePresenter<EditAddressContract.Edit
             @Override
             public void onComplete() {
                 super.onComplete();
-                getView().hideLoading();
+                if (getView() != null) {
+                    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());
-                }
             }
         });
     }

+ 46 - 0
BaseLibrary/src/main/java/com/cooleshow/base/presenter/ScanPresenter.java

@@ -0,0 +1,46 @@
+package com.cooleshow.base.presenter;
+
+import com.cooleshow.base.bean.AddressBean;
+import com.cooleshow.base.constanst.AddressListContract;
+import com.cooleshow.base.constanst.ScanContract;
+import com.cooleshow.base.data.api.UploadApi;
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.ErrorParse;
+import com.cooleshow.base.utils.ToastUtil;
+
+import java.util.List;
+
+
+/**
+ * 创建日期:2022/5/17 15:23
+ *
+ * @author Ryan
+ * 类说明:
+ */
+public class ScanPresenter extends BasePresenter<ScanContract.ScanView> implements ScanContract.Presenter {
+    /**
+     * 二维码扫描登录
+     *
+     * @param code
+     */
+    public void doQrLogin(String code) {
+        getView().showLoading();
+        addSubscribe(create(UploadApi.class).doQrLogin(code), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+//                    getView().delAddress();
+                }
+            }
+
+            @Override
+            public void onComplete() {
+                super.onComplete();
+                if (getView() != null) {
+                    getView().hideLoading();
+                }
+            }
+        });
+    }
+}

+ 1 - 0
BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt

@@ -174,6 +174,7 @@ object RouterPath {
         companion object {
             const val MINE_ADDRESS_LIST = "/base/ui/AddressListActivity"
             const val MINE_EDIT_ADDRESS = "/base/ui/EditAddressActivity"
+            const val SCAN_QR_CODE = "/base/ui/scan/ScanActivity"
         }
     }
 

+ 183 - 0
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/scan/ScanActivity.java

@@ -0,0 +1,183 @@
+package com.cooleshow.base.ui.activity.scan;
+
+import android.Manifest;
+import android.content.ContentResolver;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Color;
+import android.net.Uri;
+import android.provider.MediaStore;
+import android.text.TextUtils;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.R;
+import com.cooleshow.base.common.WebConstants;
+import com.cooleshow.base.constanst.ScanContract;
+import com.cooleshow.base.databinding.ActivityScanLayoutBinding;
+import com.cooleshow.base.presenter.ScanPresenter;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.LogUtils;
+import com.cooleshow.base.utils.PermissionUtils;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.helper.GlideEngine;
+import com.cooleshow.base.widgets.DialogUtil;
+import com.luck.picture.lib.PictureSelector;
+import com.luck.picture.lib.config.PictureConfig;
+import com.luck.picture.lib.config.PictureMimeType;
+import com.luck.picture.lib.entity.LocalMedia;
+import com.luck.picture.lib.tools.PictureFileUtils;
+import com.tbruyelle.rxpermissions3.RxPermissions;
+import com.uuzuche.lib_zxing.activity.CaptureFragment;
+import com.uuzuche.lib_zxing.activity.CodeUtils;
+
+import java.io.File;
+import java.util.List;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Author by pq, Date on 2022/7/11.
+ */
+@Route(path = RouterPath.BaseCenter.SCAN_QR_CODE)
+public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, ScanPresenter> implements ScanContract.ScanView, CodeUtils.AnalyzeCallback, View.OnClickListener {
+    public static final int SELECT_IMG_REQUEST_CODE = 1001;
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "扫码登录");
+        viewBinding.toolbarInclude.tvRight.setVisibility(View.VISIBLE);
+        viewBinding.toolbarInclude.tvRight.setImageResource(R.drawable.icon_scan_by_photo_album);
+        /**
+         * 执行扫面Fragment的初始化操作
+         */
+        CaptureFragment captureFragment = new CaptureFragment();
+        // 为二维码扫描界面设置定制化界面
+        CodeUtils.setFragmentArgs(captureFragment, R.layout.my_camera);
+
+        captureFragment.setAnalyzeCallback(this);
+        /**
+         * 替换我们的扫描控件
+         */
+        getSupportFragmentManager().beginTransaction().replace(R.id.fl_my_container, captureFragment).commit();
+        viewBinding.toolbarInclude.tvRight.setOnClickListener(this);
+    }
+
+    @Override
+    protected ActivityScanLayoutBinding getLayoutView() {
+        return ActivityScanLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ScanPresenter createPresenter() {
+        return new ScanPresenter();
+    }
+
+    @Override
+    public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
+        LogUtils.i("pq", "解析成功:" + result);
+        LogUtils.i("pq", "解析成功mBitmap:" + mBitmap);
+        parseResult(result);
+    }
+
+    private void parseResult(String result) {
+        if (TextUtils.isEmpty(result)) {
+            return;
+        }
+        if (!checkUrlIsEnable(result)) {
+            ToastUtil.getInstance().showShort("未知链接");
+            return;
+        }
+        ARouter.getInstance()
+                .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                .withString(WebConstants.WEB_URL, result)
+                .navigation();
+    }
+
+    @Override
+    public void onAnalyzeFailed() {
+        ToastUtil.getInstance().showShort("解析失败");
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.tv_right) {
+            //去图库选择图片
+            addPermissions();
+        }
+    }
+
+    private void addPermissions() {
+        new RxPermissions(this)
+                .request(Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE)
+                .subscribe(permission -> {
+                    if (permission) {
+                        PictureSelector.create(this)
+                                .openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
+                                .imageEngine(GlideEngine.createGlideEngine())
+                                .theme(com.cooleshow.base.R.style.picture_daya_style)// 主题样式设置 具体参考 values/styles   用法:R .style.picture.white.style
+                                .selectionMode(PictureConfig.SINGLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE
+                                .enableCrop(false)// 是否裁剪 true or false
+                                .showCropGrid(false)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false    true or false
+                                .compress(true)// 是否压缩 true or false
+                                .circleDimmedLayer(false)// 是否圆形裁剪 true or false
+                                .forResult(PictureConfig.CHOOSE_REQUEST);
+                    } else {
+                        DialogUtil.showInCenter(getSupportFragmentManager(), com.cooleshow.base.R.layout.common_popu, (holder, dialog) -> {
+                            TextView tvTitle = holder.getView(com.cooleshow.base.R.id.tv_title);
+                            TextView tvContent = holder.getView(com.cooleshow.base.R.id.tv_content);
+                            TextView btncancel = holder.getView(com.cooleshow.base.R.id.btn_cancel);
+                            TextView btnCommit = holder.getView(com.cooleshow.base.R.id.btn_commit);
+                            tvTitle.setText("提示");
+                            tvContent.setText("选择照片需要相机、储存权限,去设置?");
+                            btncancel.setOnClickListener(view1 -> {
+                                dialog.dismiss();
+                            });
+                            btnCommit.setOnClickListener(view1 -> {
+                                PermissionUtils.toSelfSetting(this);
+                                dialog.dismiss();
+                            });
+                        });
+                    }
+                });
+    }
+
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+        if (resultCode == RESULT_OK) {
+            if (requestCode == PictureConfig.CHOOSE_REQUEST) {
+                // 图片、视频、音频选择结果回调
+                List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
+                String avatar = selectList.get(0).getCompressPath();
+                try {
+                    CodeUtils.analyzeBitmap(avatar, new CodeUtils.AnalyzeCallback() {
+                        @Override
+                        public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
+                            ToastUtil.getInstance().showShort("解析成功");
+                            parseResult(result);
+                        }
+
+                        @Override
+                        public void onAnalyzeFailed() {
+                            ToastUtil.getInstance().showShort("解析二维码失败");
+                        }
+                    });
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+
+    private boolean checkUrlIsEnable(String url) {
+        if (url.contains("colexiu")) {
+            return true;
+        }
+        return false;
+    }
+}

+ 1 - 1
BaseLibrary/src/main/java/com/cooleshow/base/utils/UiUtils.java

@@ -185,7 +185,7 @@ public class UiUtils {
     }
 
     public static String getCourseTimeString(String start, String end) {
-        if (TextUtils.isEmpty(start) && TextUtils.isEmpty(end)) {
+        if (TextUtils.isEmpty(start) || TextUtils.isEmpty(end)) {
             return "";
         }
         if (TextUtils.isEmpty(start) && !TextUtils.isEmpty(end)) {

+ 194 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/GlideEngine.java

@@ -0,0 +1,194 @@
+package com.cooleshow.base.utils.helper;
+
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.PointF;
+import android.view.View;
+import android.widget.ImageView;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.resource.bitmap.BitmapTransitionOptions;
+import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
+import com.bumptech.glide.request.RequestOptions;
+import com.bumptech.glide.request.target.BitmapImageViewTarget;
+import com.bumptech.glide.request.target.ImageViewTarget;
+import com.bumptech.glide.request.transition.DrawableCrossFadeFactory;
+import com.luck.picture.lib.engine.ImageEngine;
+import com.luck.picture.lib.listener.OnImageCompleteCallback;
+import com.luck.picture.lib.tools.MediaUtils;
+import com.luck.picture.lib.widget.longimage.ImageSource;
+import com.luck.picture.lib.widget.longimage.ImageViewState;
+import com.luck.picture.lib.widget.longimage.SubsamplingScaleImageView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.graphics.drawable.RoundedBitmapDrawable;
+import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;
+
+/**
+ * Description:
+ * Copyright  : Copyright (c) 2019
+ * Company    : 大雅乐盟
+ * Author     : r
+ * Date       : 2019/12/21 16:36
+ */
+public class GlideEngine implements ImageEngine {
+
+    /**
+     * 加载图片
+     *
+     * @param context
+     * @param url
+     * @param imageView
+     */
+    @Override
+    public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+        DrawableCrossFadeFactory drawableCrossFadeFactory =
+                new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();
+        Glide.with(context)
+                .load(url)
+                .transition(DrawableTransitionOptions.withCrossFade(drawableCrossFadeFactory))
+                .into(imageView);
+    }
+
+    @Override
+    public void loadImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView, SubsamplingScaleImageView longImageView, OnImageCompleteCallback callback) {
+        DrawableCrossFadeFactory drawableCrossFadeFactory =
+                new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();
+        Glide.with(context)
+                .load(url)
+                .transition(DrawableTransitionOptions.withCrossFade(drawableCrossFadeFactory))
+                .into(imageView);
+    }
+
+
+    /**
+     * 加载网络图片适配长图方案
+     * # 注意:此方法只有加载网络图片才会回调
+     *
+     * @param context
+     * @param url
+     * @param imageView
+     * @param longImageView
+     */
+    @Override
+    public void loadImage(@NonNull Context context, @NonNull String url,
+                          @NonNull ImageView imageView,
+                          SubsamplingScaleImageView longImageView) {
+        Glide.with(context)
+                .asBitmap()
+                .load(url)
+                .into(new ImageViewTarget<Bitmap>(imageView) {
+                    @Override
+                    protected void setResource(@Nullable Bitmap resource) {
+                        if (resource != null) {
+                            boolean eqLongImage = MediaUtils.isLongImg(resource.getWidth(),
+                                    resource.getHeight());
+                            longImageView.setVisibility(eqLongImage ? View.VISIBLE : View.GONE);
+                            imageView.setVisibility(eqLongImage ? View.GONE : View.VISIBLE);
+                            if (eqLongImage) {
+                                // 加载长图
+                                longImageView.setQuickScaleEnabled(true);
+                                longImageView.setZoomEnabled(true);
+                                longImageView.setPanEnabled(true);
+                                longImageView.setDoubleTapZoomDuration(100);
+                                longImageView.setMinimumScaleType(SubsamplingScaleImageView.SCALE_TYPE_CENTER_CROP);
+                                longImageView.setDoubleTapZoomDpi(SubsamplingScaleImageView.ZOOM_FOCUS_CENTER);
+                                longImageView.setImage(ImageSource.bitmap(resource),
+                                        new ImageViewState(0, new PointF(0, 0), 0));
+                            } else {
+                                // 普通图片
+                                imageView.setImageBitmap(resource);
+                            }
+                        }
+                    }
+                });
+    }
+
+    /**
+     * 加载相册目录
+     *
+     * @param context   上下文
+     * @param url       图片路径
+     * @param imageView 承载图片ImageView
+     */
+    @Override
+    public void loadFolderImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+        // * other https://www.jianshu.com/p/28f5bcee409f
+        DrawableCrossFadeFactory drawableCrossFadeFactory =
+                new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();
+        Glide.with(context)
+                .asBitmap()
+                .load(url)
+                .override(180, 180)
+                .centerCrop()
+                .sizeMultiplier(0.5f)
+                .apply(new RequestOptions().placeholder(com.luck.picture.lib.R.drawable.picture_image_placeholder))
+                .transition(BitmapTransitionOptions.withCrossFade(drawableCrossFadeFactory))
+                .into(new BitmapImageViewTarget(imageView) {
+                    @Override
+                    protected void setResource(Bitmap resource) {
+                        RoundedBitmapDrawable circularBitmapDrawable =
+                                RoundedBitmapDrawableFactory.
+                                        create(context.getResources(), resource);
+                        circularBitmapDrawable.setCornerRadius(8);
+                        imageView.setImageDrawable(circularBitmapDrawable);
+                    }
+                });
+    }
+
+
+    /**
+     * 加载gif
+     *
+     * @param context   上下文
+     * @param url       图片路径
+     * @param imageView 承载图片ImageView
+     */
+    @Override
+    public void loadAsGifImage(@NonNull Context context, @NonNull String url,
+                               @NonNull ImageView imageView) {
+        Glide.with(context)
+                .asGif()
+                .load(url)
+                .into(imageView);
+    }
+
+    /**
+     * 加载图片列表图片
+     *
+     * @param context   上下文
+     * @param url       图片路径
+     * @param imageView 承载图片ImageView
+     */
+    @Override
+    public void loadGridImage(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
+        // * other https://www.jianshu.com/p/28f5bcee409f
+        DrawableCrossFadeFactory drawableCrossFadeFactory =
+                new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();
+        Glide.with(context)
+                .load(url)
+                .override(200, 200)
+                .centerCrop()
+                .apply(new RequestOptions().placeholder(com.luck.picture.lib.R.drawable.picture_image_placeholder))
+                .transition(DrawableTransitionOptions.withCrossFade(drawableCrossFadeFactory))
+                .into(imageView);
+    }
+
+
+    private GlideEngine() {
+    }
+
+    private static GlideEngine instance;
+
+    public static GlideEngine createGlideEngine() {
+        if (null == instance) {
+            synchronized (GlideEngine.class) {
+                if (null == instance) {
+                    instance = new GlideEngine();
+                }
+            }
+        }
+        return instance;
+    }
+}

TEMPAT SAMPAH
BaseLibrary/src/main/res/drawable-xhdpi/icon_scan.png


TEMPAT SAMPAH
BaseLibrary/src/main/res/drawable-xhdpi/icon_scan_by_photo_album.png


TEMPAT SAMPAH
BaseLibrary/src/main/res/drawable-xxhdpi/icon_scan.png


TEMPAT SAMPAH
BaseLibrary/src/main/res/drawable-xxhdpi/icon_scan_by_photo_album.png


+ 23 - 0
BaseLibrary/src/main/res/layout/activity_scan_layout.xml

@@ -0,0 +1,23 @@
+<?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">
+
+    <FrameLayout
+        android:id="@+id/fl_my_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="parent" />
+
+    <include
+        android:id="@+id/toolbar_include"
+        layout="@layout/common_toolbar_layout_white"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+    
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 37 - 0
BaseLibrary/src/main/res/layout/my_camera.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:ignore="MissingDefaultResource">
+
+    <SurfaceView
+        android:id="@+id/preview_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content" />
+
+    <com.uuzuche.lib_zxing.view.ViewfinderView
+        android:id="@+id/viewfinder_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        app:inner_corner_color="@color/white"
+        app:inner_corner_length="30dp"
+        app:inner_corner_width="5dp"
+        app:inner_height="255dp"
+        app:inner_margintop="180dp"
+        app:inner_scan_bitmap="@null"
+        app:inner_scan_iscircle="false"
+        app:inner_scan_speed="20"
+        app:inner_width="255dp" />
+
+    <TextView
+        android:layout_gravity="center_horizontal"
+        android:layout_marginTop="453dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:includeFontPadding="false"
+        android:text="请对准需要识别的二维码。"
+        android:textColor="@color/white"
+        android:textSize="@dimen/sp_16" />
+</FrameLayout>

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

@@ -39,6 +39,7 @@ import com.tencent.bugly.crashreport.CrashReport;
 import com.rong.io.live.helper.LiveRTCEngineInitHelper;
 import com.umeng.commonsdk.UMConfigure;
 import com.umeng.socialize.PlatformConfig;
+import com.uuzuche.lib_zxing.activity.ZXingLibrary;
 import com.vanniktech.emoji.EmojiManager;
 import com.vanniktech.emoji.ios.IosEmojiProvider;
 
@@ -83,6 +84,8 @@ public class App extends BaseApplication {
         CrashReport.initCrashReport(getApplicationContext(), "b51fd73164", false);
         initRong();
         initUmeng();
+        //二维码扫描
+        ZXingLibrary.initDisplayOpinion(this);
     }
 
     private void initMidFile() {

+ 7 - 1
student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java

@@ -119,6 +119,12 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
                         .withString(WebConstants.WEB_URL, WebConstants.STUDENT_TEACHER_FOLLOW)
                         .navigation();
                 break;
+            case R.id.iv_scan:
+                //二维码扫描
+                ARouter.getInstance()
+                        .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                        .navigation();
+                break;
         }
     }
 
@@ -180,7 +186,7 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
         mViewBinding.llFollowTeacher.setOnClickListener(this);
         mViewBinding.llFinishedClass.setOnClickListener(this);
         mViewBinding.llResidueClass.setOnClickListener(this);
-
+        mViewBinding.ivScan.setOnClickListener(this);
     }
 
     @Override

+ 5 - 1
student/src/main/java/com/cooleshow/student/ui/message/MessageBoxActivity.java

@@ -17,6 +17,7 @@ import com.chad.library.adapter.base.listener.OnItemClickListener;
 import com.chad.library.adapter.base.listener.OnLoadMoreListener;
 import com.cooleshow.base.bean.RouteBean;
 import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.constanst.RouteConstants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 
@@ -138,6 +139,9 @@ public class MessageBoxActivity extends BaseMVPActivity<ActivityMessageBoxBindin
                     if (!TextUtils.isEmpty(item.memo)) {
                         try {
                             RouteBean routeBean = GsonUtils.fromJson(item.memo, RouteBean.class);
+                            if (TextUtils.equals(routeBean.pageTag, RouteConstants.PAGE_TAG_MESSAGE)) {
+                                return;
+                            }
                             JumpUtils.jump(routeBean);
                         } catch (Exception e) {
                             e.printStackTrace();
@@ -196,7 +200,7 @@ public class MessageBoxActivity extends BaseMVPActivity<ActivityMessageBoxBindin
                 if (data.rows != null && data.rows.size() > 0) {
                     checkHasNext(data.rows.size());
                     messageBoxAdapter.setNewInstance(data.rows);
-                }else{
+                } else {
                     messageBoxAdapter.notifyDataSetChanged();
                 }
             } else {

TEMPAT SAMPAH
student/src/main/res/drawable-xhdpi/icon_setting.png


TEMPAT SAMPAH
student/src/main/res/drawable-xxhdpi/icon_setting.png


+ 13 - 1
student/src/main/res/layout/fragment_mine_layout.xml

@@ -27,13 +27,25 @@
             app:layout_constraintTop_toTopOf="parent" />
 
         <ImageView
+            android:id="@+id/iv_scan"
+            android:paddingStart="12dp"
+            android:paddingBottom="12dp"
+            android:paddingTop="12dp"
+            app:layout_constraintRight_toLeftOf="@+id/iv_setting"
+            app:layout_constraintBottom_toBottomOf="@+id/iv_setting"
+            app:layout_constraintTop_toTopOf="@+id/iv_setting"
+            android:src="@drawable/icon_scan"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <ImageView
             android:id="@+id/iv_setting"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginTop="@dimen/dp_43"
             android:layout_marginRight="@dimen/dp_7"
             android:padding="15dp"
-            android:src="@drawable/icon_mine_setting"
+            android:src="@drawable/icon_setting"
             app:layout_constraintRight_toRightOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/view_status_bar" />
 

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

@@ -31,6 +31,7 @@ import com.tencent.bugly.crashreport.CrashReport;
 import com.rong.io.live.helper.LiveRTCEngineInitHelper;
 import com.umeng.commonsdk.UMConfigure;
 import com.umeng.socialize.PlatformConfig;
+import com.uuzuche.lib_zxing.activity.ZXingLibrary;
 import com.vanniktech.emoji.EmojiManager;
 import com.vanniktech.emoji.ios.IosEmojiProvider;
 
@@ -93,6 +94,8 @@ public class App extends BaseApplication {
         registrationId = JPushInterface.getRegistrationID(this);
         initRong();
         initUmeng();
+        //二维码扫描
+        ZXingLibrary.initDisplayOpinion(this);
     }
   /*  public static String channel;
     public void initBaseOtherSdk() {

+ 7 - 1
teacher/src/main/java/com/cooleshow/teacher/ui/main/HomeFragment.kt

@@ -20,7 +20,6 @@ import com.cooleshow.teacher.constants.TeacherInfoConstants
 import com.cooleshow.teacher.contract.HomeContract
 import com.cooleshow.teacher.databinding.FragmentHomeLayoutBinding
 import com.cooleshow.teacher.presenter.main.HomePresenter
-import com.cooleshow.teacher.ui.course.SparringCourseDetailActivity
 import com.cooleshow.usercenter.helper.UserHelper
 import java.util.*
 
@@ -53,6 +52,7 @@ class HomeFragment : BaseMVPFragment<FragmentHomeLayoutBinding, HomePresenter>()
         mViewBinding.ivChat.setOnClickListener(this)
         mViewBinding.bgAnnouncement.setOnClickListener(this)
         mViewBinding.cardKotofusa.setOnClickListener(this)
+        mViewBinding.ivScan.setOnClickListener(this)
     }
 
     override fun createPresenter(): HomePresenter {
@@ -202,6 +202,12 @@ class HomeFragment : BaseMVPFragment<FragmentHomeLayoutBinding, HomePresenter>()
                     .withString(WebConstants.WEB_URL, WebConstants.PIANO_ROOM)
                     .navigation()
             }
+            R.id.iv_scan -> {
+                //二维码扫描
+                ARouter.getInstance()
+                    .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                    .navigation()
+            }
         }
 
     }

+ 4 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/message/MessageBoxActivity.java

@@ -17,6 +17,7 @@ import com.chad.library.adapter.base.listener.OnItemClickListener;
 import com.chad.library.adapter.base.listener.OnLoadMoreListener;
 import com.cooleshow.base.bean.RouteBean;
 import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.constanst.RouteConstants;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.GsonUtils;
@@ -142,6 +143,9 @@ public class MessageBoxActivity extends BaseMVPActivity<ActivityMessageBoxBindin
                     if (!TextUtils.isEmpty(item.memo)) {
                         try {
                             RouteBean routeBean = GsonUtils.fromJson(item.memo, RouteBean.class);
+                            if (TextUtils.equals(routeBean.pageTag, RouteConstants.PAGE_TAG_MESSAGE)) {
+                                return;
+                            }
                             JumpUtils.jump(routeBean);
                         } catch (Exception e) {
                             e.printStackTrace();

TEMPAT SAMPAH
teacher/src/main/res/drawable-xhdpi/icon_setting.png


TEMPAT SAMPAH
teacher/src/main/res/drawable-xxhdpi/icon_setting.png


+ 25 - 10
teacher/src/main/res/layout/fragment_home_layout.xml

@@ -31,8 +31,8 @@
         <ImageView
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:src="@drawable/bg_home_header2"
             android:layout_marginTop="@dimen/dp_11"
+            android:src="@drawable/bg_home_header2"
             app:layout_constraintRight_toRightOf="parent"
             app:layout_constraintTop_toTopOf="@+id/iv_avatar" />
 
@@ -42,11 +42,26 @@
             android:layout_height="wrap_content"
             android:layout_marginStart="14dp"
             android:layout_marginTop="25dp"
-            android:visibility="gone"
-            app:layout_goneMarginTop="@dimen/dp_25"
             android:src="@drawable/icon_app_name_word"
+            android:visibility="gone"
             app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/view_status_bar" />
+            app:layout_constraintTop_toBottomOf="@+id/view_status_bar"
+            app:layout_goneMarginTop="@dimen/dp_25" />
+
+        <ImageView
+            android:id="@+id/iv_scan"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginEnd="5dp"
+            android:paddingStart="12dp"
+            android:paddingTop="12dp"
+            android:paddingEnd="12dp"
+            android:paddingBottom="12dp"
+            android:src="@drawable/icon_scan"
+            app:layout_constraintBottom_toBottomOf="@+id/iv_chat"
+            app:layout_constraintRight_toLeftOf="@+id/iv_chat"
+            app:layout_constraintTop_toTopOf="@+id/iv_chat" />
+
 
         <ImageView
             android:id="@+id/iv_chat"
@@ -81,8 +96,8 @@
             android:id="@+id/iv_avatar"
             android:layout_width="52dp"
             android:layout_height="52dp"
-            android:layout_marginTop="37dp"
             android:layout_marginLeft="@dimen/dp_14"
+            android:layout_marginTop="37dp"
             android:src="@drawable/icon_teacher_default_head"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/iv_app_name" />
@@ -269,12 +284,12 @@
             android:layout_marginStart="14dp"
             android:layout_marginTop="@dimen/dp_111"
             android:layout_marginEnd="14dp"
-            app:layout_goneMarginTop="@dimen/dp_100"
             android:background="@drawable/bg_white_10dp"
             android:elevation="2dp"
             android:orientation="horizontal"
             app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintTop_toBottomOf="@+id/iv_avatar">
+            app:layout_constraintTop_toBottomOf="@+id/iv_avatar"
+            app:layout_goneMarginTop="@dimen/dp_100">
 
             <ImageView
                 android:id="@+id/iv_bell"
@@ -321,8 +336,8 @@
             android:layout_marginRight="@dimen/dp_14"
             android:background="@drawable/bg_white_10dp"
             android:visibility="gone"
-            tools:visibility="visible"
-            app:layout_constraintTop_toBottomOf="@+id/bg_announcement">
+            app:layout_constraintTop_toBottomOf="@+id/bg_announcement"
+            tools:visibility="visible">
 
             <ImageView
                 android:id="@+id/alarm_icon"
@@ -330,8 +345,8 @@
                 android:layout_height="@dimen/dp_15"
                 android:layout_marginLeft="@dimen/dp_19"
                 android:src="@mipmap/small_alarm_clock"
-                app:layout_constraintLeft_toLeftOf="parent"
                 app:layout_constraintBottom_toBottomOf="@+id/tv_live_time"
+                app:layout_constraintLeft_toLeftOf="parent"
                 app:layout_constraintTop_toTopOf="@+id/tv_live_time" />
 
             <TextView

+ 13 - 0
teacher/src/main/res/layout/fragment_mine_layout.xml

@@ -31,6 +31,19 @@
             app:layout_constraintTop_toTopOf="parent" />
 
         <ImageView
+            android:visibility="gone"
+            android:id="@+id/iv_scan"
+            android:paddingStart="12dp"
+            android:paddingBottom="12dp"
+            android:paddingTop="12dp"
+            app:layout_constraintRight_toLeftOf="@+id/iv_setting"
+            app:layout_constraintBottom_toBottomOf="@+id/iv_setting"
+            app:layout_constraintTop_toTopOf="@+id/iv_setting"
+            android:src="@drawable/icon_scan"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+        <ImageView
             android:id="@+id/iv_setting"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"