Browse Source

增加扫码登录流程

Pq 6 months ago
parent
commit
568a7b7a1e
45 changed files with 1058 additions and 110 deletions
  1. 4 0
      BaseLibrary/build.gradle
  2. 0 4
      BaseLibrary/src/main/AndroidManifest.xml
  3. 3 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java
  4. 4 3
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/BasePresenter.java
  5. 0 46
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/ScanPresenter.java
  6. 0 1
      BaseLibrary/src/main/java/com/cooleshow/base/presenter/UserDetailPresenter.java
  7. 3 1
      BaseLibrary/src/main/java/com/cooleshow/base/router/RouterPath.kt
  8. 0 22
      BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/tools/SmallToolsActivity.java
  9. 13 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/IntentUtils.java
  10. 5 0
      BaseLibrary/src/main/res/drawable/shape_f2f5fa_22dp.xml
  11. 4 0
      gradle.properties
  12. 1 1
      student/src/main/java/com/cooleshow/student/ui/main/MineFragment.java
  13. 1 1
      student/src/main/java/com/cooleshow/student/ui/main/NewHomeFragment.java
  14. 1 1
      teacher/src/main/java/com/cooleshow/teacher/ui/main/HomeFragment.kt
  15. 1 1
      teacher/src/main/java/com/cooleshow/teacher/ui/main/MineFragment.java
  16. 1 1
      teacher/src/main/java/com/cooleshow/teacher/ui/main/NewHomeFragment.java
  17. 15 0
      usercenter/src/main/AndroidManifest.xml
  18. 95 0
      usercenter/src/main/java/com/cooleshow/usercenter/bean/AuthQrcodeResultBean.java
  19. 25 0
      usercenter/src/main/java/com/cooleshow/usercenter/bean/QrcodeDataBean.java
  20. 33 0
      usercenter/src/main/java/com/cooleshow/usercenter/constants/QrCodeResultType.java
  21. 31 0
      usercenter/src/main/java/com/cooleshow/usercenter/constants/QrCodeType.java
  22. 13 0
      usercenter/src/main/java/com/cooleshow/usercenter/data/api/UserApi.kt
  23. 50 0
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/ConfirScanLoginPresenter.java
  24. 76 0
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/ScanPresenter.java
  25. 18 0
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/contract/ConfirmScanLoginContract.java
  26. 5 1
      usercenter/src/main/java/com/cooleshow/usercenter/presenter/contract/ScanContract.java
  27. 75 0
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/scan/AuthLoginResultActivity.java
  28. 122 0
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/scan/ConfirmScanLoginActivity.java
  29. 115 27
      usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/scan/ScanActivity.java
  30. 78 0
      usercenter/src/main/java/com/cooleshow/usercenter/widget/dialog/ScanResultTipDialog.java
  31. BIN
      usercenter/src/main/res/drawable-xhdpi/bg_privacy_tip_dialog_top.png
  32. BIN
      usercenter/src/main/res/drawable-xhdpi/icon_about_logo_teacher.png
  33. BIN
      usercenter/src/main/res/drawable-xhdpi/icon_privacy_tag.png
  34. BIN
      usercenter/src/main/res/drawable-xhdpi/icon_qrcode_auth_failed_tip.png
  35. BIN
      usercenter/src/main/res/drawable-xhdpi/icon_qrcode_expired_tip.png
  36. BIN
      usercenter/src/main/res/drawable-xxhdpi/bg_privacy_tip_dialog_top.png
  37. BIN
      usercenter/src/main/res/drawable-xxhdpi/icon_about_logo_teacher.png
  38. BIN
      usercenter/src/main/res/drawable-xxhdpi/icon_privacy_tag.png
  39. BIN
      usercenter/src/main/res/drawable-xxhdpi/icon_qrcode_auth_failed_tip.png
  40. BIN
      usercenter/src/main/res/drawable-xxhdpi/icon_qrcode_expired_tip.png
  41. 68 0
      usercenter/src/main/res/layout/ac_auth_login_result_layout.xml
  42. 67 0
      usercenter/src/main/res/layout/ac_confirm_scan_login_layout.xml
  43. 0 0
      usercenter/src/main/res/layout/activity_scan_layout.xml
  44. 121 0
      usercenter/src/main/res/layout/dialog_scan_result_tip_layout.xml
  45. 10 0
      usercenter/src/main/res/values/strings.xml

+ 4 - 0
BaseLibrary/build.gradle

@@ -27,6 +27,7 @@ android {
             buildConfigField "String", "BASE_SERVER_URL", RELEASE_BASE_URL
             buildConfigField "String", "BASE_URL_H5", RELEASE_BASE_URL_H5
             buildConfigField "String", "BASE_URL_H5_STUDENT", RELEASE_BASE_URL_H5_STUDENT
+            buildConfigField "String", "RESOURCE_BASE_URL", RELEASE_RESOURCE_BASE_URL
         }
 
         debug {
@@ -35,6 +36,8 @@ android {
             buildConfigField "String", "BASE_SERVER_URL", TEST_BASE_URL
             buildConfigField "String", "BASE_URL_H5", TEST_BASE_URL_H5
             buildConfigField "String", "BASE_URL_H5_STUDENT", TEST_BASE_URL_H5_STUDENT
+            buildConfigField "String", "RESOURCE_BASE_URL", TEST_RESOURCE_BASE_URL
+
         }
 
         preRelease{
@@ -44,6 +47,7 @@ android {
             buildConfigField "String", "BASE_SERVER_URL", DEV_BASE_URL
             buildConfigField "String", "BASE_URL_H5", DEV_BASE_URL_H5
             buildConfigField "String", "BASE_URL_H5_STUDENT", DEV_BASE_URL_H5_STUDENT
+            buildConfigField "String", "RESOURCE_BASE_URL", DEV_RESOURCE_BASE_URL
         }
     }
     compileOptions {

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

@@ -29,10 +29,6 @@
             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" />
 
         <activity
             android:name=".ui.activity.userInfo.StudentUserInfoDetailActivity"

+ 3 - 0
BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java

@@ -11,6 +11,7 @@ import com.tencent.open.im.IM;
  */
 public class BaseConstant {
     public final static String SERVER_ADDRESS = BuildConfig.BASE_SERVER_URL;
+    public final static String RESOURCE_SERVER_ADDRESS = BuildConfig.RESOURCE_BASE_URL;
     public final static String TEACHER_GROUP = "api-teacher/";
     public final static String TEACHER_GROUP2 = "api-teacher";
     public final static String STUDENT_GROUP = "api-student/";
@@ -33,6 +34,8 @@ public class BaseConstant {
     public static final String TEACHER_CLIENT_TYPE = "TEACHER";
     public static final String STUDENT_CLIENT_TYPE = "STUDENT";
 
+    public final static String CLIENT_APP_KEY = "KLX";
+
     private static String getClientType() {
         if (BaseApplication.Companion.isTeacherClient()) {
             return TEACHER_CLIENT_TYPE;

+ 4 - 3
BaseLibrary/src/main/java/com/cooleshow/base/presenter/BasePresenter.java

@@ -1,5 +1,6 @@
 package com.cooleshow.base.presenter;
 
+import com.cooleshow.base.data.net.RetrofitClientNoToken;
 import com.cooleshow.base.data.net.RetrofitFactory;
 import com.cooleshow.base.presenter.view.BaseView;
 import com.cooleshow.base.rx.BaseObserver;
@@ -101,9 +102,9 @@ public class BasePresenter<V extends BaseView> implements IPresenter<V> {
         return RetrofitFactory.Companion.getInstance().create(clazz);
     }
 
-//    protected <T> T createNoToken(Class<T> clazz) {
-//        return RetrofitClientNoToken.getInstance().getRetrofit().create(clazz);
-//    }
+    protected <T> T createNoToken(Class<T> clazz) {
+        return RetrofitClientNoToken.getInstance().getRetrofit().create(clazz);
+    }
 //
 //    protected <T> T createUpFile(Class<T> clazz) {
 //        return RetrofitClientUpFile.getInstance().getRetrofit().create(clazz);

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

@@ -1,46 +0,0 @@
-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();
-                }
-            }
-        });
-    }
-}

+ 0 - 1
BaseLibrary/src/main/java/com/cooleshow/base/presenter/UserDetailPresenter.java

@@ -3,7 +3,6 @@ package com.cooleshow.base.presenter;
 import com.cooleshow.base.bean.RecentPracticeBean;
 import com.cooleshow.base.bean.UserDetailInfoBean;
 import com.cooleshow.base.common.BaseApplication;
-import com.cooleshow.base.constanst.ScanContract;
 import com.cooleshow.base.contract.UserDetailContract;
 import com.cooleshow.base.data.api.UploadApi;
 import com.cooleshow.base.rx.BaseObserver;

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

@@ -64,6 +64,9 @@ object RouterPath {
             const val MINE_MODIFY_PASSWORD = "/userCenter/ModifyPasswordActivity"
             const val MINE_FEEDBACK = "/userCenter/MINE_FEEDBACK"
             const val MINE_FEEDBACK_RECORD = "/userCenter/FeedBackRecordActivity"
+            const val SCAN_QR_AUTH_RESULT_CODE = "/userCenter/AuthLoginResultActivity"
+            const val SCAN_QR_CODE = "/userCenter/ScanActivity"
+            const val MINE_CONFIRM_SCAN_LOGIN_PAGE = "/userCenter/ConfirmScanLoginActivity"
         }
     }
 
@@ -199,7 +202,6 @@ 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"
             const val USER_DETAIL_STU = "/base/ui/userInfo/StudentUserInfoDetailActivity"
             const val SMALL_TOOLS = "/base/ui/tools/SmallToolsActivity"
             const val CHAT_PHOTO_PREVIEW = "/base/ui/tools/activity/PhotoPreviewActivity"

+ 0 - 22
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/tools/SmallToolsActivity.java

@@ -1,37 +1,15 @@
 package com.cooleshow.base.ui.activity.tools;
 
-import android.Manifest;
-import android.content.Intent;
-import android.graphics.Bitmap;
 import android.os.Bundle;
-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.databinding.ActivitySmallToolsLayoutBinding;
-import com.cooleshow.base.presenter.ScanPresenter;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseActivity;
-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.utils.helper.QMUIStatusBarHelper;
-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.tbruyelle.rxpermissions3.RxPermissions;
-
-import java.util.List;
 
 import androidx.annotation.Nullable;
 

+ 13 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/IntentUtils.java

@@ -1,6 +1,7 @@
 package com.cooleshow.base.utils;
 
 import android.content.ComponentName;
+import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.net.Uri;
@@ -535,4 +536,16 @@ public final class IntentUtils {
 //        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
 //        return intent;
 //    }
+
+    public static void openByBrowser(Context context, String url) {
+        try {
+            LogUtils.i("download:" + url);
+            Intent intent = new Intent(Intent.ACTION_VIEW);
+            intent.addCategory(Intent.CATEGORY_BROWSABLE);
+            intent.setData(Uri.parse(url));
+            context.startActivity(intent);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

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

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

+ 4 - 0
gradle.properties

@@ -47,3 +47,7 @@ TEST_BASE_URL_H5_JG ="https://test.colexiu.com/tenant"
 RELEASE_BASE_URL_H5_JG ="https://online.colexiu.com/tenant"
 DEV_BASE_URL_H5_JG ="https://dev.colexiu.com/tenant"
 
+DEV_RESOURCE_BASE_URL = "https://dev.resource.colexiu.com/cbs-app"
+TEST_RESOURCE_BASE_URL = "https://test.resource.colexiu.com/cbs-app"
+RELEASE_RESOURCE_BASE_URL = "https://mec.colexiu.com/cbs-app"
+

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

@@ -177,7 +177,7 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
                 }
                 //二维码扫描
                 ARouter.getInstance()
-                        .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                        .build(RouterPath.UserCenter.SCAN_QR_CODE)
                         .navigation();
                 break;
             case R.id.iv_coupon:

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

@@ -826,7 +826,7 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
             }
             //二维码扫描
             ARouter.getInstance()
-                    .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                    .build(RouterPath.UserCenter.SCAN_QR_CODE)
                     .navigation();
             return;
         }

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

@@ -237,7 +237,7 @@ class HomeFragment : BaseMVPFragment<FragmentHomeLayoutBinding, HomePresenter>()
                 }
                 //二维码扫描
                 ARouter.getInstance()
-                    .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                    .build(RouterPath.UserCenter.SCAN_QR_CODE)
                     .navigation()
             }
         }

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

@@ -348,7 +348,7 @@ public class MineFragment extends BaseMVPFragment<FragmentMineLayoutBinding, Min
             case R.id.iv_scan:
                 //二维码扫描
                 ARouter.getInstance()
-                        .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                        .build(RouterPath.UserCenter.SCAN_QR_CODE)
                         .navigation();
                 break;
             case R.id.tv_mine_income:

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

@@ -742,7 +742,7 @@ public class NewHomeFragment extends BaseMVPFragment<FragmentNewHomeLayoutBindin
         if (id == R.id.iv_scan) {
             //二维码扫描
             ARouter.getInstance()
-                    .build(RouterPath.BaseCenter.SCAN_QR_CODE)
+                    .build(RouterPath.UserCenter.SCAN_QR_CODE)
                     .navigation();
             return;
         }

+ 15 - 0
usercenter/src/main/AndroidManifest.xml

@@ -69,5 +69,20 @@
             android:windowSoftInputMode="adjustPan"
             android:configChanges="orientation|screenSize|keyboardHidden"
             android:screenOrientation="portrait" />
+
+        <activity
+            android:name=".ui.activity.scan.ScanActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden"
+            android:screenOrientation="portrait" />
+
+        <activity
+            android:name=".ui.activity.scan.AuthLoginResultActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout"
+            android:screenOrientation="portrait" />
+
+        <activity
+            android:name=".ui.activity.scan.ConfirmScanLoginActivity"
+            android:configChanges="orientation|screenSize|keyboardHidden|fontScale|smallestScreenSize|screenLayout"
+            android:screenOrientation="portrait" />
     </application>
 </manifest>

+ 95 - 0
usercenter/src/main/java/com/cooleshow/usercenter/bean/AuthQrcodeResultBean.java

@@ -0,0 +1,95 @@
+package com.cooleshow.usercenter.bean;
+
+/**
+ * Author by pq, Date on 2024/3/13.
+ */
+public class AuthQrcodeResultBean {
+
+
+    /**
+     * appKey :
+     * clientType :
+     * data : {}
+     * status :
+     * timestamp : 0
+     * token :
+     * username :
+     * uuid :
+     */
+
+    private String appKey;
+    private String clientType;
+    private DataBean data;
+    private String status;
+    private String timestamp;
+    private String token;
+    private String username;
+    private String uuid;
+
+    public String getAppKey() {
+        return appKey;
+    }
+
+    public void setAppKey(String appKey) {
+        this.appKey = appKey;
+    }
+
+    public String getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(String clientType) {
+        this.clientType = clientType;
+    }
+
+    public DataBean getData() {
+        return data;
+    }
+
+    public void setData(DataBean data) {
+        this.data = data;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+
+    public static class DataBean {
+    }
+}

+ 25 - 0
usercenter/src/main/java/com/cooleshow/usercenter/bean/QrcodeDataBean.java

@@ -0,0 +1,25 @@
+package com.cooleshow.usercenter.bean;
+
+/**
+ * Author by pq, Date on 2024/3/13.
+ */
+public class QrcodeDataBean {
+    private String action;
+    private String uuid;
+
+    public String getType() {
+        return action;
+    }
+
+    public void setType(String type) {
+        this.action = type;
+    }
+
+    public String getUuid() {
+        return uuid;
+    }
+
+    public void setUuid(String uuid) {
+        this.uuid = uuid;
+    }
+}

+ 33 - 0
usercenter/src/main/java/com/cooleshow/usercenter/constants/QrCodeResultType.java

@@ -0,0 +1,33 @@
+package com.cooleshow.usercenter.constants;
+
+/**
+ * Author by pq, Date on 2022/12/23.
+ */
+public enum QrCodeResultType {
+    CODE_EXPIRED("code_expired", "二维码已过期", "请在乐教通刷新二维码后重新扫码"),
+    CODE_ERROR("code_error", "无法识别", "当前二维码无法识别"),
+    CODE_AUTH_FAILED("code_auth_failed", "授权失败", "授权失败,请重新扫码授权");
+
+    private final String tip;
+    private final String title;
+    private final String id;
+
+
+    public String getId() {
+        return id;
+    }
+
+    public String getTip() {
+        return tip;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    QrCodeResultType(String id, String s, String tip) {
+        this.id = id;
+        this.title = s;
+        this.tip = tip;
+    }
+}

+ 31 - 0
usercenter/src/main/java/com/cooleshow/usercenter/constants/QrCodeType.java

@@ -0,0 +1,31 @@
+package com.cooleshow.usercenter.constants;
+
+import com.contrarywind.interfaces.IPickerViewData;
+
+/**
+ * Author by pq, Date on 2022/12/23.
+ */
+public enum QrCodeType implements IPickerViewData {
+    AUTH_LOGIN("login", "登录授权");
+
+    private final String value;
+    private final String id;
+
+    public String getValue() {
+        return value;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    QrCodeType(String id, String s) {
+        this.id = id;
+        this.value = s;
+    }
+
+    @Override
+    public String getPickerViewText() {
+        return getValue();
+    }
+}

+ 13 - 0
usercenter/src/main/java/com/cooleshow/usercenter/data/api/UserApi.kt

@@ -5,6 +5,7 @@ import com.cooleshow.base.bean.QueryParamsConfigBean
 import com.cooleshow.base.bean.ServiceContactBean
 import com.cooleshow.base.common.BaseConstant
 import com.cooleshow.base.data.net.BaseResponse
+import com.cooleshow.usercenter.bean.AuthQrcodeResultBean
 import com.cooleshow.usercenter.bean.FeedBackRecordListBean
 import com.cooleshow.usercenter.bean.FeedBackTypeBean
 import com.cooleshow.usercenter.bean.StudentUserInfo
@@ -269,4 +270,16 @@ interface UserApi {
         @Body convertToRequestBodyJson: RequestBody?,
         @Path("group_name") group_name: String
     ): Observable<BaseResponse<FeedBackRecordListBean?>?>?
+
+    @POST()
+    fun notifyScan(
+        @Url url: String?,
+        @Body body: RequestBody?
+    ): Observable<BaseResponse<Any?>?>?
+
+    @POST
+    fun authQrcode(
+        @Url url: String?,
+        @Body body: RequestBody?
+    ): Observable<BaseResponse<AuthQrcodeResultBean?>?>?
 }

+ 50 - 0
usercenter/src/main/java/com/cooleshow/usercenter/presenter/ConfirScanLoginPresenter.java

@@ -0,0 +1,50 @@
+package com.cooleshow.usercenter.presenter;
+
+import com.cooleshow.base.common.BaseConstant;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+import com.cooleshow.usercenter.bean.AuthQrcodeResultBean;
+import com.cooleshow.usercenter.data.api.UserApi;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.cooleshow.usercenter.presenter.contract.ConfirmScanLoginContract;
+
+import org.json.JSONObject;
+
+/**
+ * Author by pq, Date on 2022/12/26.
+ */
+public class ConfirScanLoginPresenter extends BasePresenter<ConfirmScanLoginContract.ConfirmScanLoginView> implements ConfirmScanLoginContract.Presenter {
+    public void authQrcode(String uuid) {
+        if (getView() != null) {
+            getView().showLoading();
+        }
+        JSONObject jsonObject = new JSONObject();
+        try {
+            String userToken = UserHelper.getUserToken();
+            String[] s = userToken.split(" ");
+            jsonObject.putOpt("appKey", BaseConstant.CLIENT_APP_KEY);
+            jsonObject.putOpt("clientType", BaseConstant.TEACHER_CLIENT_TYPE);
+            jsonObject.putOpt("token", s[1]);
+            jsonObject.putOpt("uuid", uuid);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String url = BaseConstant.RESOURCE_SERVER_ADDRESS + "/open/qrcode/verify";
+        addSubscribe(createNoToken(UserApi.class).authQrcode(url, RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<AuthQrcodeResultBean>(getView()) {
+            @Override
+            protected void onSuccess(AuthQrcodeResultBean data) {
+                if (getView() != null) {
+                    getView().authQrcodeSuccess(data);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                if (getView() != null) {
+                    getView().authQrcodeError(e);
+                }
+            }
+        });
+    }
+}

+ 76 - 0
usercenter/src/main/java/com/cooleshow/usercenter/presenter/ScanPresenter.java

@@ -0,0 +1,76 @@
+package com.cooleshow.usercenter.presenter;
+
+import com.cooleshow.base.common.BaseConstant;
+import com.cooleshow.usercenter.data.api.UserApi;
+import com.cooleshow.usercenter.helper.UserHelper;
+import com.cooleshow.usercenter.presenter.contract.ScanContract;
+import com.cooleshow.base.data.api.UploadApi;
+import com.cooleshow.base.presenter.BasePresenter;
+import com.cooleshow.base.rx.BaseObserver;
+import com.cooleshow.base.utils.RequestBodyUtil;
+
+import org.json.JSONObject;
+
+
+/**
+ * 创建日期: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();
+                }
+            }
+        });
+    }
+
+    public void notifyScan(String uuid) {
+        JSONObject jsonObject = new JSONObject();
+        try {
+            String userToken = UserHelper.getUserToken();
+            String[] s = userToken.split(" ");
+            jsonObject.putOpt("appKey", BaseConstant.CLIENT_APP_KEY);
+            jsonObject.putOpt("clientType", BaseConstant.CLIENT_TYPE);
+            jsonObject.putOpt("token", s[1]);
+            jsonObject.putOpt("uuid", uuid);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String url = BaseConstant.RESOURCE_SERVER_ADDRESS + "/open/qrcode/scan";
+        addSubscribe(createNoToken(UserApi.class).notifyScan(url, RequestBodyUtil.convertToRequestBodyJson(jsonObject.toString())), new BaseObserver<Object>(getView()) {
+            @Override
+            protected void onSuccess(Object data) {
+                if (getView() != null) {
+                    getView().notifyScanSuccess(uuid);
+                }
+            }
+
+            @Override
+            public void onError(Throwable e) {
+                if (getView() != null) {
+                    getView().notifyScanError(e);
+                }
+            }
+        });
+    }
+}

+ 18 - 0
usercenter/src/main/java/com/cooleshow/usercenter/presenter/contract/ConfirmScanLoginContract.java

@@ -0,0 +1,18 @@
+package com.cooleshow.usercenter.presenter.contract;
+
+import com.cooleshow.base.presenter.view.BaseView;
+import com.cooleshow.usercenter.bean.AuthQrcodeResultBean;
+
+/**
+ * Author by pq, Date on 2022/4/20.
+ */
+public interface ConfirmScanLoginContract {
+
+    interface ConfirmScanLoginView extends BaseView {
+        void authQrcodeSuccess(AuthQrcodeResultBean data);
+        void authQrcodeError(Throwable e);
+    }
+
+    interface Presenter {
+    }
+}

+ 5 - 1
BaseLibrary/src/main/java/com/cooleshow/base/constanst/ScanContract.java → usercenter/src/main/java/com/cooleshow/usercenter/presenter/contract/ScanContract.java

@@ -1,4 +1,4 @@
-package com.cooleshow.base.constanst;
+package com.cooleshow.usercenter.presenter.contract;
 
 import com.cooleshow.base.bean.AddressBean;
 import com.cooleshow.base.presenter.view.BaseView;
@@ -13,6 +13,10 @@ import java.util.List;
  */
 public interface ScanContract {
     interface ScanView extends BaseView {
+        void notifyScanSuccess(String uuid);
+
+        void notifyScanError(Throwable e);
+
     }
     interface Presenter {
     }

+ 75 - 0
usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/scan/AuthLoginResultActivity.java

@@ -0,0 +1,75 @@
+package com.cooleshow.usercenter.ui.activity.scan;
+
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.View;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseActivity;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.usercenter.R;
+import com.cooleshow.usercenter.constants.QrCodeResultType;
+import com.cooleshow.usercenter.databinding.AcAuthLoginResultLayoutBinding;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Author by pq, Date on 2022/7/11.
+ */
+@Route(path = RouterPath.UserCenter.SCAN_QR_AUTH_RESULT_CODE)
+public class AuthLoginResultActivity extends BaseActivity<AcAuthLoginResultLayoutBinding> implements View.OnClickListener {
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+    @Override
+    protected void initView() {
+        String title = getIntent().getStringExtra(Constants.COMMON_EXTRA_KEY);
+        if (TextUtils.isEmpty(title)) {
+            title = "扫描结果";
+        }
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, title);
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        QrCodeResultType resultType = (QrCodeResultType) getIntent().getSerializableExtra(Constants.COMMON_EXTRA_KEY);
+        if (resultType == null) {
+            finish();
+            return;
+        }
+        viewBinding.tvTip.setText(resultType.getTitle());
+        viewBinding.tvTip2.setText(resultType.getTip());
+        if (resultType == QrCodeResultType.CODE_AUTH_FAILED) {
+            viewBinding.imLogo.setImageResource(R.drawable.icon_qrcode_auth_failed_tip);
+        } else {
+            viewBinding.imLogo.setImageResource(R.drawable.icon_qrcode_expired_tip);
+        }
+
+        viewBinding.tvConfirm.setOnClickListener(this);
+    }
+
+
+    @Override
+    protected AcAuthLoginResultLayoutBinding getLayoutView() {
+        return AcAuthLoginResultLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.tv_confirm) {
+            ARouter.getInstance().build(RouterPath.UserCenter.SCAN_QR_CODE)
+                    .navigation();
+            finish();
+            return;
+        }
+    }
+}

+ 122 - 0
usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/scan/ConfirmScanLoginActivity.java

@@ -0,0 +1,122 @@
+package com.cooleshow.usercenter.ui.activity.scan;
+
+import android.os.Bundle;
+import android.text.SpannableString;
+import android.text.TextUtils;
+import android.view.View;
+
+import com.alibaba.android.arouter.facade.annotation.Route;
+import com.alibaba.android.arouter.launcher.ARouter;
+import com.cooleshow.base.constanst.Constants;
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.base.router.RouterPath;
+import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.JumpUtils;
+import com.cooleshow.base.utils.ToastUtil;
+import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.usercenter.R;
+import com.cooleshow.usercenter.bean.AuthQrcodeResultBean;
+import com.cooleshow.usercenter.constants.QrCodeResultType;
+import com.cooleshow.usercenter.databinding.AcConfirmScanLoginLayoutBinding;
+import com.cooleshow.usercenter.presenter.ConfirScanLoginPresenter;
+import com.cooleshow.usercenter.presenter.contract.ConfirmScanLoginContract;
+
+import androidx.annotation.Nullable;
+
+/**
+ * Author by pq, Date on 2024/3/13.
+ */
+@Route(path = RouterPath.UserCenter.MINE_CONFIRM_SCAN_LOGIN_PAGE)
+public class ConfirmScanLoginActivity extends BaseMVPActivity<AcConfirmScanLoginLayoutBinding, ConfirScanLoginPresenter> implements View.OnClickListener, ConfirmScanLoginContract.ConfirmScanLoginView {
+
+    private String uuid;
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+    @Override
+    protected void initView() {
+        initMidTitleToolBar(viewBinding.toolbarInclude.toolbar, "授权登录");
+    }
+
+    @Override
+    public void initData() {
+        super.initData();
+        SpannableString string = UiUtils.diffColorString("使用管乐团伴学端账号授权登录", "「乐教通」", getResources().getColor(com.cooleshow.base.R.color.color_777777), getResources().getColor(com.cooleshow.base.R.color.color_2dc7aa));
+        viewBinding.tvTip.setText(string);
+        initListener();
+        uuid = getIntent().getStringExtra(Constants.COMMON_EXTRA_KEY);
+        if (TextUtils.isEmpty(uuid)) {
+            ToastUtil.getInstance().showShort("参数异常");
+            finish();
+            return;
+        }
+    }
+
+    private void initListener() {
+        viewBinding.tvCancel.setOnClickListener(this);
+        viewBinding.tvConfirm.setOnClickListener(this);
+    }
+
+    @Override
+    protected AcConfirmScanLoginLayoutBinding getLayoutView() {
+        return AcConfirmScanLoginLayoutBinding.inflate(getLayoutInflater());
+    }
+
+    @Override
+    protected ConfirScanLoginPresenter createPresenter() {
+        return new ConfirScanLoginPresenter();
+    }
+
+    @Override
+    public void onClick(View v) {
+        if (UiUtils.isFastClick(500)) {
+            return;
+        }
+        int id = v.getId();
+        if (id == R.id.tv_cancel) {
+            finish();
+            return;
+        }
+        if (id == R.id.tv_confirm) {
+            presenter.authQrcode(uuid);
+            return;
+        }
+    }
+
+    @Override
+    public void authQrcodeSuccess(AuthQrcodeResultBean data) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        ToastUtil.getInstance().showShort("授权成功");
+        JumpUtils.jumpMain(0);
+    }
+
+    @Override
+    public void authQrcodeError(Throwable e) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        if (e instanceof ApiException) {
+            ApiException apiException = (ApiException) e;
+            int errcode = apiException.getErrcode();
+            QrCodeResultType resultType;
+            if (errcode == 5440) {
+                resultType = QrCodeResultType.CODE_EXPIRED;
+            } else {
+                resultType = QrCodeResultType.CODE_AUTH_FAILED;
+            }
+            ARouter.getInstance().build(RouterPath.UserCenter.SCAN_QR_AUTH_RESULT_CODE)
+                    .withString(Constants.COMMON_EXTRA_KEY,"授权登录")
+                    .withSerializable(Constants.COMMON_EXTRA_KEY, resultType).navigation();
+            finish();
+            return;
+        }
+        super.onError(e);
+    }
+}

+ 115 - 27
BaseLibrary/src/main/java/com/cooleshow/base/ui/activity/scan/ScanActivity.java → usercenter/src/main/java/com/cooleshow/usercenter/ui/activity/scan/ScanActivity.java

@@ -1,42 +1,41 @@
-package com.cooleshow.base.ui.activity.scan;
+package com.cooleshow.usercenter.ui.activity.scan;
 
 import android.Manifest;
-import android.content.ContentResolver;
+import android.content.DialogInterface;
 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.constanst.Constants;
+import com.cooleshow.base.data.net.ApiException;
+import com.cooleshow.usercenter.presenter.contract.ScanContract;
+import com.cooleshow.usercenter.presenter.ScanPresenter;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
+import com.cooleshow.base.utils.GsonUtils;
+import com.cooleshow.base.utils.IntentUtils;
 import com.cooleshow.base.utils.LOG;
-import com.cooleshow.base.utils.LogUtils;
-import com.cooleshow.base.utils.PermissionUtils;
 import com.cooleshow.base.utils.ThreadUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.UiUtils;
+import com.cooleshow.base.utils.UrlUtils;
 import com.cooleshow.base.utils.helper.GlideEngine;
 import com.cooleshow.base.utils.helper.PermissionTipHelper;
-import com.cooleshow.base.widgets.DialogUtil;
+import com.cooleshow.usercenter.bean.QrcodeDataBean;
+import com.cooleshow.usercenter.constants.QrCodeResultType;
+import com.cooleshow.usercenter.constants.QrCodeType;
+import com.cooleshow.usercenter.databinding.ActivityScanLayoutBinding;
+import com.cooleshow.usercenter.widget.dialog.ScanResultTipDialog;
 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 java.io.File;
 import java.util.List;
 
 import androidx.annotation.Nullable;
@@ -45,7 +44,7 @@ import cn.bingoogolapple.qrcode.core.QRCodeView;
 /**
  * Author by pq, Date on 2022/7/11.
  */
-@Route(path = RouterPath.BaseCenter.SCAN_QR_CODE)
+@Route(path = RouterPath.UserCenter.SCAN_QR_CODE)
 public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, ScanPresenter> implements ScanContract.ScanView, View.OnClickListener {
     public static final int SELECT_IMG_REQUEST_CODE = 1001;
 
@@ -82,8 +81,7 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
                     LOG.i("pq", "解析成功:" + result);
                     parseResult(result);
                 } else {
-                    sendResetMsg();
-                    ToastUtil.getInstance().showShort("解析失败");
+                    goErrorPage();
                 }
             }
 
@@ -125,16 +123,43 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
         if (TextUtils.isEmpty(result)) {
             return;
         }
-        if (!checkUrlIsEnable(result)) {
-            sendResetMsg();
-            ToastUtil.getInstance().showShort("请扫描酷乐秀二维码");
-            return;
+        boolean isValidUrl = UrlUtils.isValidUrl(result);
+        if (isValidUrl) {
+            if (checkUrlIsEnable(result)) {
+                ARouter.getInstance()
+                        .build(RouterPath.WebCenter.ACTIVITY_HTML)
+                        .withString(WebConstants.WEB_URL, result)
+                        .navigation();
+                finish();
+            }else{
+                showScanResultTipDialog(result);
+            }
+        }else{
+            QrcodeDataBean qrcodeDataBean = parseIntent(result);
+            if (qrcodeDataBean != null) {
+                if (TextUtils.equals(qrcodeDataBean.getType(), QrCodeType.AUTH_LOGIN.getId())) {
+                    presenter.notifyScan(qrcodeDataBean.getUuid());
+                    return;
+                }
+                ToastUtil.getInstance().showShort("当前版本无法识别该二维码");
+            } else {
+                ARouter.getInstance().build(RouterPath.UserCenter.SCAN_QR_AUTH_RESULT_CODE)
+                        .withSerializable(Constants.COMMON_EXTRA_KEY, QrCodeResultType.CODE_ERROR).navigation();
+                finish();
+            }
         }
-        ARouter.getInstance()
-                .build(RouterPath.WebCenter.ACTIVITY_HTML)
-                .withString(WebConstants.WEB_URL, result)
-                .navigation();
-        finish();
+    }
+
+    private QrcodeDataBean parseIntent(String result) {
+        try {
+            QrcodeDataBean qrcodeDataBean = GsonUtils.fromJson(result, QrcodeDataBean.class);
+            if (qrcodeDataBean != null && !TextUtils.isEmpty(qrcodeDataBean.getType()) && !TextUtils.isEmpty(qrcodeDataBean.getUuid())) {
+                return qrcodeDataBean;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
     }
 
     private void sendResetMsg() {
@@ -142,6 +167,33 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
     }
 
 
+    private void showScanResultTipDialog(String url) {
+        String tipResult = "下个页面不受我们控制哦,使用时请注意安全\n" + url;
+        ScanResultTipDialog scanResultTipDialog = new ScanResultTipDialog(this);
+        scanResultTipDialog.show();
+        scanResultTipDialog.setContent(tipResult);
+        scanResultTipDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
+            @Override
+            public void onDismiss(DialogInterface dialog) {
+                reset();
+            }
+        });
+        scanResultTipDialog.setOnCancelClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                scanResultTipDialog.dismiss();
+            }
+        });
+        scanResultTipDialog.setOnConfirmClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                scanResultTipDialog.dismiss();
+                IntentUtils.openByBrowser(ScanActivity.this, url);
+                finish();
+            }
+        });
+    }
+
     @Override
     public void onClick(View v) {
         int id = v.getId();
@@ -166,6 +218,12 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
                 });
     }
 
+    private void goErrorPage() {
+        ARouter.getInstance().build(RouterPath.UserCenter.SCAN_QR_AUTH_RESULT_CODE)
+                .withSerializable(Constants.COMMON_EXTRA_KEY, QrCodeResultType.CODE_ERROR).navigation();
+        finish();
+    }
+
     private void addPermissions() {
         String[] permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE};
         PermissionTipHelper.getInstance().showTipDialog(this, permissions);
@@ -230,4 +288,34 @@ public class ScanActivity extends BaseMVPActivity<ActivityScanLayoutBinding, Sca
         super.onDestroy();
         ThreadUtils.getMainHandler().removeCallbacks(mRunnable);
     }
+
+    @Override
+    public void notifyScanSuccess(String uuid) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        ARouter.getInstance().build(RouterPath.UserCenter.MINE_CONFIRM_SCAN_LOGIN_PAGE)
+                .withString(Constants.COMMON_EXTRA_KEY, uuid).navigation();
+        finish();
+    }
+
+    @Override
+    public void notifyScanError(Throwable e) {
+        if (!checkActivityExist()) {
+            return;
+        }
+        reset();
+        if (e instanceof ApiException) {
+            ApiException apiException = (ApiException) e;
+            int errcode = apiException.getErrcode();
+            if (errcode == 5440) {
+                ARouter.getInstance().build(RouterPath.UserCenter.SCAN_QR_AUTH_RESULT_CODE)
+                        .withString(Constants.COMMON_EXTRA_KEY, "授权登录")
+                        .withSerializable(Constants.COMMON_EXTRA_KEY, QrCodeResultType.CODE_EXPIRED).navigation();
+                finish();
+                return;
+            }
+        }
+        super.onError(e);
+    }
 }

+ 78 - 0
usercenter/src/main/java/com/cooleshow/usercenter/widget/dialog/ScanResultTipDialog.java

@@ -0,0 +1,78 @@
+package com.cooleshow.usercenter.widget.dialog;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.method.LinkMovementMethod;
+import android.view.Gravity;
+import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
+import android.widget.TextView;
+
+import com.cooleshow.base.widgets.dialog.BaseFullDialog;
+import com.cooleshow.usercenter.R;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Author by pq, Date on 2022/7/19.
+ */
+public class ScanResultTipDialog extends BaseFullDialog {
+
+    private TextView mTvContent;
+    private TextView mCancel;
+    private TextView mBtnCommit;
+
+    public ScanResultTipDialog(@NonNull Context context) {
+        super(context, com.cooleshow.base.R.style.DialogStyle);
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setContentView(R.layout.dialog_scan_result_tip_layout);
+        initParams();
+        setCanceledOnTouchOutside(false);
+        setCancelable(false);
+        mTvContent = findViewById(R.id.tv_content);
+        mCancel = findViewById(R.id.btn_cancel);
+        mBtnCommit = findViewById(R.id.btn_commit);
+        mTvContent.setMovementMethod(LinkMovementMethod.getInstance());
+    }
+
+    private void initParams(){
+        Window window = getWindow();
+        //设置dialog在屏幕底部
+        window.setGravity(Gravity.CENTER);
+        //设置dialog弹出时的动画效果,从屏幕底部向上弹出
+        window.getDecorView().setPadding(0, 0, 0, 0);
+        //获得window窗口的属性
+        WindowManager.LayoutParams lp = window.getAttributes();
+        //设置窗口宽度为充满全屏
+        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
+        //设置窗口高度为包裹内容
+        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
+        lp.horizontalMargin = 0;
+        lp.verticalMargin = 0;
+        //将设置好的属性set回去
+        window.setAttributes(lp);
+    }
+
+    public void setContent(CharSequence content) {
+        if (mTvContent != null) {
+            mTvContent.setText(content);
+        }
+    }
+
+    public void setOnCancelClickListener(View.OnClickListener onCancelClickListener) {
+        if (mCancel != null) {
+            mCancel.setOnClickListener(onCancelClickListener);
+        }
+    }
+
+    public void setOnConfirmClickListener(View.OnClickListener onConfirmClickListener) {
+        if (mBtnCommit != null) {
+            mBtnCommit.setOnClickListener(onConfirmClickListener);
+        }
+    }
+}

BIN
usercenter/src/main/res/drawable-xhdpi/bg_privacy_tip_dialog_top.png


BIN
usercenter/src/main/res/drawable-xhdpi/icon_about_logo_teacher.png


BIN
usercenter/src/main/res/drawable-xhdpi/icon_privacy_tag.png


BIN
usercenter/src/main/res/drawable-xhdpi/icon_qrcode_auth_failed_tip.png


BIN
usercenter/src/main/res/drawable-xhdpi/icon_qrcode_expired_tip.png


BIN
usercenter/src/main/res/drawable-xxhdpi/bg_privacy_tip_dialog_top.png


BIN
usercenter/src/main/res/drawable-xxhdpi/icon_about_logo_teacher.png


BIN
usercenter/src/main/res/drawable-xxhdpi/icon_privacy_tag.png


BIN
usercenter/src/main/res/drawable-xxhdpi/icon_qrcode_auth_failed_tip.png


BIN
usercenter/src/main/res/drawable-xxhdpi/icon_qrcode_expired_tip.png


+ 68 - 0
usercenter/src/main/res/layout/ac_auth_login_result_layout.xml

@@ -0,0 +1,68 @@
+<?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"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:background="@color/white">
+
+    <include
+        android:id="@+id/toolbar_include"
+        layout="@layout/common_toolbar_layout" />
+
+    <ImageView
+        android:src="@drawable/icon_qrcode_expired_tip"
+        android:id="@+id/im_logo"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="60dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/toolbar_include" />
+
+    <TextView
+        android:id="@+id/tv_tip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="30dp"
+        android:includeFontPadding="false"
+        tools:text="@string/qrcode_expired_tip_str"
+        android:textStyle="bold"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_18"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/im_logo" />
+
+
+    <TextView
+        android:id="@+id/tv_tip2"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="15dp"
+        android:includeFontPadding="false"
+        tools:text="@string/qrcode_expired_tip2"
+        android:textColor="@color/color_777777"
+        android:textSize="@dimen/sp_16"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/tv_tip" />
+
+    <TextView
+        android:textSize="@dimen/sp_16"
+        android:textColor="@color/white"
+        android:gravity="center"
+        android:text="重新扫码"
+        android:background="@drawable/shape_2dc7aa_22dp"
+        android:id="@+id/tv_confirm"
+        android:layout_width="match_parent"
+        android:layout_height="42dp"
+        android:layout_marginStart="38dp"
+        android:layout_marginEnd="38dp"
+        android:layout_marginBottom="44dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 67 - 0
usercenter/src/main/res/layout/ac_confirm_scan_login_layout.xml

@@ -0,0 +1,67 @@
+<?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:background="@color/white">
+
+    <include
+        android:id="@+id/toolbar_include"
+        layout="@layout/common_toolbar_layout" />
+
+    <ImageView
+        android:id="@+id/im_logo"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="60dp"
+        android:background="@drawable/icon_about_logo_teacher"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/toolbar_include" />
+
+    <TextView
+        android:id="@+id/tv_tip"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="30dp"
+        android:includeFontPadding="false"
+        android:text="使用酷乐秀学院端账号授权登录「乐教通」"
+        android:textColor="@color/color_777777"
+        android:textSize="@dimen/sp_14"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@+id/im_logo" />
+
+    <TextView
+        android:text="@string/cancel_login_tip_str"
+        android:textColor="@color/color_333333"
+        android:textSize="@dimen/sp_16"
+        android:background="@drawable/shape_f2f5fa_22dp"
+        android:layout_marginBottom="44dp"
+        android:id="@+id/tv_cancel"
+        android:layout_width="match_parent"
+        android:layout_height="42dp"
+        android:layout_marginStart="38dp"
+        android:layout_marginEnd="38dp"
+        android:gravity="center"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+    <TextView
+        android:textSize="@dimen/sp_16"
+        android:textColor="@color/white"
+        android:gravity="center"
+        android:text="@string/auth_login_str"
+        android:background="@drawable/shape_2dc7aa_22dp"
+        android:id="@+id/tv_confirm"
+        android:layout_width="match_parent"
+        android:layout_height="42dp"
+        android:layout_marginStart="38dp"
+        android:layout_marginEnd="38dp"
+        android:layout_marginBottom="16dp"
+        app:layout_constraintBottom_toTopOf="@+id/tv_cancel"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>

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


+ 121 - 0
usercenter/src/main/res/layout/dialog_scan_result_tip_layout.xml

@@ -0,0 +1,121 @@
+<?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="@dimen/dp_272"
+    android:layout_height="wrap_content"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_gravity="center"
+    android:background="@android:color/transparent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="@dimen/dp_272"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="23dp"
+        android:background="@drawable/bg_white_10dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+
+        <ImageView
+            android:id="@+id/iv_top_bg"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:adjustViewBounds="true"
+            android:src="@drawable/bg_privacy_tip_dialog_top"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="54dp"
+            android:gravity="center"
+            android:text="温馨提示"
+            android:textColor="@color/color_333333"
+            android:textSize="@dimen/sp_18"
+            android:textStyle="bold"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+
+        <TextView
+            android:id="@+id/tv_content"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="20dp"
+            android:lineSpacingExtra="@dimen/dp_2"
+            android:paddingStart="@dimen/dp_22"
+            android:paddingEnd="@dimen/dp_22"
+            android:paddingBottom="@dimen/dp_30"
+            android:maxLines="3"
+            android:ellipsize="end"
+            tools:text="下个页面不受我们控制哦,使用时请注意安全\nhttps://www.pgyer.com/70e7…"
+            android:textColor="@color/color_666666"
+            android:textSize="@dimen/dp_15"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_title" />
+
+        <View
+            android:id="@+id/view_line1"
+            android:layout_width="0dp"
+            android:layout_height="1dp"
+            android:background="@color/color_f2f2f2"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/tv_content" />
+
+        <View
+            android:id="@+id/view_line2"
+            android:layout_width="1dp"
+            android:layout_height="0dp"
+            android:background="@color/color_f2f2f2"
+            app:layout_constraintBottom_toBottomOf="@+id/btn_cancel"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toBottomOf="@+id/view_line1" />
+
+        <TextView
+            android:id="@+id/btn_cancel"
+            android:layout_width="0dp"
+            android:layout_height="49dp"
+            android:gravity="center"
+            android:text="取消"
+            android:textColor="@color/color_777777"
+            android:textSize="@dimen/dp_16"
+            android:textStyle="bold"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintRight_toLeftOf="@+id/view_line2"
+            app:layout_constraintTop_toBottomOf="@id/view_line1" />
+
+        <TextView
+            android:id="@+id/btn_commit"
+            android:layout_width="0dp"
+            android:layout_height="0dp"
+            android:gravity="center"
+            android:text="浏览器打开"
+            android:textColor="@color/color_2dc7aa"
+            android:textSize="@dimen/dp_16"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="@+id/btn_cancel"
+            app:layout_constraintHorizontal_weight="1"
+            app:layout_constraintLeft_toRightOf="@+id/view_line2"
+            app:layout_constraintRight_toRightOf="parent"
+            app:layout_constraintTop_toTopOf="@id/btn_cancel" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+
+    <ImageView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:src="@drawable/icon_privacy_tag"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>

+ 10 - 0
usercenter/src/main/res/values/strings.xml

@@ -28,4 +28,14 @@
     <string name="str_sign_out_account_des2_detail">( 1 ) 该账号下的所有内容、信息、数据、记录、个人资料(例如:头像、昵称等)及绑定信息(例如:绑定手机号等);\n( 2 ) 该账号权益信息将被清除(例如:会员时长、购买单曲、专辑信息)。</string>
 
     <string name="custom_service_tip">或通过以下方式联系我们:\n客服电话:%s\n邮箱:%s</string>
+
+
+    <string name="qrcode_expired_tip_str">二维码已过期</string>
+    <string name="qrcode_expired_tip2">请在乐教通刷新二维码后重新扫码</string>
+
+    <string name="qrcode_auth_failed_tip_str">授权失败</string>
+    <string name="qrcode_auth_failed_tip2">授权失败,请重新扫码授权</string>
+    <string name="cancel_login_tip_str">取消授权</string>
+    <string name="auth_login_str">授权登录</string>
+
 </resources>