ソースを参照

增加APP更新逻辑

Pq 3 年 前
コミット
5f64f9cd8b
29 ファイル変更823 行追加18 行削除
  1. 5 0
      BaseLibrary/build.gradle
  2. 68 0
      BaseLibrary/src/main/java/com/cooleshow/base/bean/UpdateAppBean.java
  3. 1 0
      BaseLibrary/src/main/java/com/cooleshow/base/common/BaseConstant.java
  4. 20 0
      BaseLibrary/src/main/java/com/cooleshow/base/data/api/AppVersionApi.java
  5. 204 0
      BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/UpdateAppHelper.java
  6. 25 15
      BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/upload/UploadHelper.java
  7. 41 0
      BaseLibrary/src/main/java/com/cooleshow/base/widgets/MaxHeightScrollView.java
  8. 8 0
      BaseLibrary/src/main/res/drawable/bg_gray_left_bottom_10dp_shape.xml
  9. 8 0
      BaseLibrary/src/main/res/drawable/bg_green_right_bottom_10dp_shape.xml
  10. 8 0
      BaseLibrary/src/main/res/drawable/thumb_green_alpha_shape.xml
  11. 103 0
      BaseLibrary/src/main/res/layout/custom_dialog_one_layout.xml
  12. 89 0
      BaseLibrary/src/main/res/layout/custom_dialog_two_layout.xml
  13. 70 0
      BaseLibrary/src/main/res/layout/custom_download_failed_dialog.xml
  14. 62 0
      BaseLibrary/src/main/res/layout/custom_download_failed_two_dialog.xml
  15. 58 0
      BaseLibrary/src/main/res/layout/custom_download_layout.xml
  16. BIN
      BaseLibrary/src/main/res/mipmap-xhdpi/ic_custom_download_failed_bg.png
  17. BIN
      BaseLibrary/src/main/res/mipmap-xhdpi/iccustom_dialog_top_bg.png
  18. BIN
      BaseLibrary/src/main/res/mipmap-xhdpi/iccustom_download_failed_top_bg.png
  19. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/ic_custom_download_failed_bg.png
  20. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/iccustom_dialog_top_bg.png
  21. BIN
      BaseLibrary/src/main/res/mipmap-xxhdpi/iccustom_download_failed_top_bg.png
  22. 5 0
      BaseLibrary/src/main/res/values/attrs.xml
  23. 4 0
      student/build.gradle
  24. 8 1
      student/src/main/java/com/cooleshow/student/ui/main/MainActivity.java
  25. 10 0
      student/src/main/java/com/cooleshow/student/ui/mine/AboutActivity.java
  26. 3 0
      teacher/build.gradle
  27. 7 0
      teacher/src/main/java/com/cooleshow/teacher/ui/main/MainActivity.java
  28. 10 0
      teacher/src/main/java/com/cooleshow/teacher/ui/mine/AboutActivity.java
  29. 6 2
      teacher/src/main/java/com/cooleshow/teacher/ui/score/MineScoreActivity.java

+ 5 - 0
BaseLibrary/build.gradle

@@ -183,6 +183,11 @@ dependencies {
     api 'org.greenrobot:eventbus:3.1.1'
 
     api 'cn.yipianfengye.android:zxing-library:2.2'
+    api ('com.github.AlexLiuSheng:CheckVersionLib:2.4.1_androidx'){
+        exclude(group: 'com.squareup.okhttp3', module: 'okhttp')
+        exclude(group: ' org.greenrobot', module: 'eventbus')
+    }
+    api "com.github.Jay-Goo:RangeSeekBar:v3.0.0"
     //UI适配
 //    api 'me.jessyan:autosize:1.2.1'
 }

+ 68 - 0
BaseLibrary/src/main/java/com/cooleshow/base/bean/UpdateAppBean.java

@@ -0,0 +1,68 @@
+package com.cooleshow.base.bean;
+
+/**
+ * Description:
+ * Copyright  : Copyright (c) 2019
+ * Company    : 大雅乐盟
+ * Author     : r
+ * Date       : 2020/12/14 20:43
+ */
+public  class UpdateAppBean {
+
+    /**
+     * status : newest
+     * version : 2.6.1
+     * isForceUpdate : true
+     * downloadUrl : aHR0cHM6Ly9tc3R1b25saW5lLmRheWFlZHUuY29tLyMvc3R1ZGVudERvd25sb2Fk
+     * description : 细节优化,bug修复
+     * updateTime : 2020-12-14 20:03:36
+     * createTime : 2020-12-14 20:03:36
+     * operatorId : 0
+     * platform : android-student
+     * forceUpdate : true
+     * id : 16
+     */
+
+    private String  version;
+    private boolean isForceUpdate;
+    private String  downloadUrl;
+    private String  description;
+
+
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public boolean isIsForceUpdate() {
+        return isForceUpdate;
+    }
+
+    public void setIsForceUpdate(boolean isForceUpdate) {
+        this.isForceUpdate = isForceUpdate;
+    }
+
+    public String getDownloadUrl() {
+        return downloadUrl;
+    }
+
+    public void setDownloadUrl(String downloadUrl) {
+        this.downloadUrl = downloadUrl;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+
+
+
+}

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

@@ -11,6 +11,7 @@ public class BaseConstant {
     public final static String TEACHER_GROUP = "api-teacher/";
     public final static String STUDENT_GROUP = "api-student/";
     public final static String AUTH_GROUP = "api-auth/";
+    public final static String ADMIN_GROUP = "api-admin/";
     public final static String MALL_ADMIN_SERVER = "api-mall-admin/";
     public final static String MALL_PORTAL_SERVER = "api-mall-portal/";
     public final static String CMS_SERVER = "api-cms/";

+ 20 - 0
BaseLibrary/src/main/java/com/cooleshow/base/data/api/AppVersionApi.java

@@ -0,0 +1,20 @@
+package com.cooleshow.base.data.api;
+
+import com.cooleshow.base.bean.UpdateAppBean;
+import com.cooleshow.base.data.net.BaseResponse;
+
+import io.reactivex.rxjava3.core.Observable;
+import retrofit2.http.GET;
+import retrofit2.http.Query;
+
+import static com.cooleshow.base.common.BaseConstant.ADMIN_GROUP;
+import static com.cooleshow.base.common.BaseConstant.AUTH_GROUP;
+
+/**
+ * Author by pq, Date on 2022/7/14.
+ */
+public interface AppVersionApi {
+
+    @GET(ADMIN_GROUP + "appVersionInfo/queryByPlatform")
+    Observable<BaseResponse<UpdateAppBean>> queryByPlatform(@Query("platform") String platfrom);
+}

+ 204 - 0
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/UpdateAppHelper.java

@@ -0,0 +1,204 @@
+package com.cooleshow.base.utils.helper;
+
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.view.KeyEvent;
+import android.widget.TextView;
+
+import com.allenliu.versionchecklib.v2.AllenVersionChecker;
+import com.allenliu.versionchecklib.v2.builder.DownloadBuilder;
+import com.allenliu.versionchecklib.v2.builder.UIData;
+import com.allenliu.versionchecklib.v2.callback.CustomDownloadingDialogListener;
+import com.allenliu.versionchecklib.v2.callback.ForceUpdateListener;
+import com.cooleshow.base.R;
+import com.cooleshow.base.bean.UpdateAppBean;
+import com.cooleshow.base.common.AppManager;
+import com.cooleshow.base.data.api.AppVersionApi;
+import com.cooleshow.base.data.net.BaseResponse;
+import com.cooleshow.base.data.net.RetrofitClientNoToken;
+import com.cooleshow.base.data.net.RetrofitFactory;
+import com.cooleshow.base.utils.AppUtils;
+import com.cooleshow.base.utils.EncodeUtils;
+import com.cooleshow.base.utils.Utils;
+import com.jaygoo.widget.RangeSeekBar;
+
+import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.annotations.NonNull;
+import io.reactivex.rxjava3.core.Observable;
+import io.reactivex.rxjava3.core.Observer;
+import io.reactivex.rxjava3.disposables.Disposable;
+import io.reactivex.rxjava3.schedulers.Schedulers;
+
+/**
+ * Author by pq, Date on 2022/7/14.
+ */
+public class UpdateAppHelper {
+    private static volatile UpdateAppHelper mHelper;
+
+    private UpdateAppHelper() {
+
+    }
+
+    public static UpdateAppHelper getInstance() {
+        if (mHelper == null) {
+            synchronized (UpdateAppHelper.class) {
+                if (mHelper == null) {
+                    mHelper = new UpdateAppHelper();
+                }
+            }
+        }
+        return mHelper;
+    }
+
+    public void checkUpdate(Activity activity, String platform) {
+        queryByPlatform(activity, platform);
+    }
+
+
+    private void queryByPlatform(Activity activity, String platform) {
+        Observable<BaseResponse<UpdateAppBean>> observable = RetrofitFactory.Companion.getInstance().create(AppVersionApi.class).queryByPlatform(platform);
+        observable.subscribeOn(Schedulers.newThread())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Observer<BaseResponse<UpdateAppBean>>() {
+                    @Override
+                    public void onSubscribe(@NonNull Disposable d) {
+
+                    }
+
+                    @Override
+                    public void onNext(@NonNull BaseResponse<UpdateAppBean> updateAppBeanBaseResponse) {
+                        if (updateAppBeanBaseResponse != null) {
+                            handleResult(activity, updateAppBeanBaseResponse.getData());
+                        }
+                    }
+
+                    @Override
+                    public void onError(@NonNull Throwable e) {
+                        e.printStackTrace();
+                    }
+
+                    @Override
+                    public void onComplete() {
+
+                    }
+                });
+    }
+
+    private void handleResult(Activity activity, UpdateAppBean data) {
+        if (!TextUtils.isEmpty(AppUtils.getAppVersionName())
+                && !TextUtils.isEmpty(data.getVersion())
+                && !TextUtils.isEmpty(data.getDownloadUrl()) && ifCanUpdate(data.getVersion())) {
+            DownloadBuilder builder = AllenVersionChecker
+                    .getInstance()
+                    .downloadOnly(UIData.create().setDownloadUrl(EncodeUtils.urlDecode(data.getDownloadUrl()))
+                            .setTitle("发现新版本:" + data.getVersion())
+                            .setContent(data.getDescription()));
+            builder.setCustomVersionDialogListener((context, versionBundle) -> {
+                Dialog baseDialog;
+                if (data.isIsForceUpdate()) {
+                    baseDialog = new Dialog(context, R.style.BaseDialog);
+                    baseDialog.setContentView(R.layout.custom_dialog_two_layout);
+                    baseDialog.setCancelable(false);
+                    baseDialog.setCanceledOnTouchOutside(false);
+                } else {
+                    baseDialog = new Dialog(context, R.style.BaseDialog);
+                    baseDialog.setContentView(R.layout.custom_dialog_one_layout);
+                }
+                TextView tvTitle = baseDialog.findViewById(R.id.tv_title);
+                TextView tvContent = baseDialog.findViewById(R.id.tv_content);
+                tvTitle.setText("V" + data.getVersion() + "新版本抢先体验");
+                tvContent.setText(versionBundle.getContent());
+                baseDialog.setOnKeyListener((dialog, keyCode, event) -> {
+                    if (keyCode == KeyEvent.KEYCODE_BACK
+                            && event.getAction() == KeyEvent.ACTION_UP) {
+                        return true;
+                    }
+                    return false;
+                });
+                return baseDialog;
+            });
+            builder.setCustomDownloadingDialogListener(new CustomDownloadingDialogListener() {
+                @Override
+                public Dialog getCustomDownloadingDialog(Context context, int progress, UIData versionBundle) {
+                    Dialog baseDialog = new Dialog(context, R.style.BaseDialog);
+                    baseDialog.setCancelable(false);
+                    baseDialog.setCanceledOnTouchOutside(false);
+                    baseDialog.setContentView(R.layout.custom_download_layout);
+                    RangeSeekBar progressBar = baseDialog.findViewById(R.id.seek_bar);
+                    progressBar.setEnabled(false);
+                    progressBar.setClickable(false);
+                    progressBar.setFocusable(false);
+                    baseDialog.setOnKeyListener((dialog, keyCode, event) -> {
+                        if (keyCode == KeyEvent.KEYCODE_BACK
+                                && event.getAction() == KeyEvent.ACTION_UP) {
+                            return true;
+                        }
+                        return false;
+                    });
+                    return baseDialog;
+                }
+
+                //下载中会不断回调updateUI方法
+                @Override
+                public void updateUI(Dialog dialog, int progress, UIData versionBundle) {
+                    RangeSeekBar progressBar = dialog.findViewById(R.id.seek_bar);
+                    progressBar.setProgress(progress);
+                    progressBar.setIndicatorText(Integer.valueOf(progress) + "%");
+                }
+            });
+
+            builder.setCustomDownloadFailedListener((context, versionBundle) -> {
+                Dialog baseDialog;
+                if (data.isIsForceUpdate()) {
+                    baseDialog = new Dialog(context, R.style.BaseDialog);
+                    baseDialog.setContentView(R.layout.custom_download_failed_two_dialog);
+                    baseDialog.setCancelable(false);
+                    baseDialog.setCanceledOnTouchOutside(false);
+                } else {
+                    baseDialog = new Dialog(context, R.style.BaseDialog);
+                    baseDialog.setContentView(R.layout.custom_download_failed_dialog);
+                }
+                baseDialog.setOnKeyListener((dialog, keyCode, event) -> {
+                    if (keyCode == KeyEvent.KEYCODE_BACK
+                            && event.getAction() == KeyEvent.ACTION_UP) {
+                        return true;
+                    }
+                    return false;
+                });
+                return baseDialog;
+            });
+            builder.setForceRedownload(true); //在本地有安装包时,是否重新下载默认alse
+            if (data.isIsForceUpdate()) {
+                builder.setForceUpdateListener(new ForceUpdateListener() {
+                    @Override
+                    public void onShouldForceUpdate() {
+                        new Handler().postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                AppManager.Companion.getInstance().finishAllActivity();
+                            }
+                        }, 500);
+                    }
+                });
+            }
+            builder.executeMission(activity);
+        }
+    }
+
+    public static boolean ifCanUpdate(String onlineVersion) {
+        String localVersion = AppUtils.getAppVersionName();
+        if (TextUtils.isEmpty(onlineVersion)) {
+            return false;
+        } else {
+            if (localVersion.compareTo(onlineVersion) < 0) {  //相等返回0,前者大返回值大于0,前者小返回值小于0
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+}

+ 25 - 15
BaseLibrary/src/main/java/com/cooleshow/base/utils/helper/upload/UploadHelper.java

@@ -88,6 +88,9 @@ public class UploadHelper {
 
     private void initUploadProgressDialog() {
         if (mActivity != null) {
+            if (mActivity.isFinishing() || mActivity.isDestroyed()) {
+                return;
+            }
             mProgressLoading = UploadProgressLoading.Companion.create(mActivity);
         }
     }
@@ -144,9 +147,7 @@ public class UploadHelper {
                 if (throwable != null) {
                     throwable.printStackTrace();
                 }
-                if (mProgressLoading != null) {
-                    mProgressLoading.hideLoading();
-                }
+                hideUploadLoading();
                 if (upLoadCallBack != null) {
                     upLoadCallBack.onFailure();
                 }
@@ -155,9 +156,7 @@ public class UploadHelper {
 
             @Override
             public void onTaskSuccess(int i, Header[] headers) {
-                if (mProgressLoading != null) {
-                    mProgressLoading.hideLoading();
-                }
+                hideUploadLoading();
                 if (null != upLoadCallBack) {
                     upLoadCallBack.onSuccess(buildUploadUrl(key));
                 }
@@ -166,9 +165,7 @@ public class UploadHelper {
 
             @Override
             public void onTaskStart() {
-                if (mProgressLoading != null) {
-                    mProgressLoading.showLoading();
-                }
+                showUploadLoading();
                 if (upLoadCallBack != null) {
                     upLoadCallBack.onUploadStart();
                 }
@@ -176,9 +173,7 @@ public class UploadHelper {
 
             @Override
             public void onTaskFinish() {
-                if (mProgressLoading != null) {
-                    mProgressLoading.hideLoading();
-                }
+                hideUploadLoading();
                 if (upLoadCallBack != null) {
                     upLoadCallBack.onUploadFinish();
                 }
@@ -186,9 +181,7 @@ public class UploadHelper {
 
             @Override
             public void onTaskCancel() {
-                if (mProgressLoading != null) {
-                    mProgressLoading.hideLoading();
-                }
+                hideUploadLoading();
                 if (upLoadCallBack != null) {
                     upLoadCallBack.onUploadCancel();
                 }
@@ -265,7 +258,24 @@ public class UploadHelper {
 
     public void setUpLoadCallBack(UpLoadCallBack upLoadCallBack) {
         this.upLoadCallBack = upLoadCallBack;
+    }
+
+    private void showUploadLoading() {
+        if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) {
+            return;
+        }
+        if (mProgressLoading != null) {
+            mProgressLoading.showLoading();
+        }
+    }
 
+    private void hideUploadLoading() {
+        if (mActivity == null || mActivity.isFinishing() || mActivity.isDestroyed()) {
+            return;
+        }
+        if (mProgressLoading != null) {
+            mProgressLoading.hideLoading();
+        }
     }
 
     public abstract static class UpLoadCallBack {

+ 41 - 0
BaseLibrary/src/main/java/com/cooleshow/base/widgets/MaxHeightScrollView.java

@@ -0,0 +1,41 @@
+package com.cooleshow.base.widgets;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.widget.ScrollView;
+
+import com.cooleshow.base.R;
+
+public class MaxHeightScrollView extends ScrollView {
+
+    private int maxHeight;
+
+    public MaxHeightScrollView(Context context) {
+        super(context);
+        maxHeight = DensityUtil.dp2px(context, 200);
+    }
+
+    public MaxHeightScrollView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
+        maxHeight = typedArray.getDimensionPixelSize(R.styleable.MaxHeightScrollView_max_height,
+                (int) DensityUtil.dp2px(context, 200));
+        typedArray.recycle();
+    }
+
+    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
+        maxHeight = typedArray.getDimensionPixelSize(R.styleable.MaxHeightScrollView_max_height,
+                (int) DensityUtil.dp2px(context, 200));
+        typedArray.recycle();
+    }
+
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+    }
+}

+ 8 - 0
BaseLibrary/src/main/res/drawable/bg_gray_left_bottom_10dp_shape.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+
+    android:shape="rectangle">
+    <solid android:color="#EEEFF3" />
+    <corners android:bottomLeftRadius="@dimen/dp_10" />
+
+</shape>

+ 8 - 0
BaseLibrary/src/main/res/drawable/bg_green_right_bottom_10dp_shape.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+
+    android:shape="rectangle">
+    <solid android:color="@color/color_2dc7aa" />
+    <corners android:bottomRightRadius="@dimen/dp_10" />
+
+</shape>

+ 8 - 0
BaseLibrary/src/main/res/drawable/thumb_green_alpha_shape.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval">
+    <solid android:color="@color/colorPrimary" />
+    <size
+        android:width="@dimen/dp_3"
+        android:height="@dimen/dp_3" />
+</shape>

+ 103 - 0
BaseLibrary/src/main/res/layout/custom_dialog_one_layout.xml

@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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="@android:color/transparent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="@dimen/dp_272"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/iv_top"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginTop="15dp"
+            android:layout_marginBottom="15dp"
+            android:background="@mipmap/iccustom_dialog_top_bg"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/white"
+            android:gravity="center"
+            android:paddingTop="@dimen/dp_26"
+            android:text="V3.1.4新版本抢先体验"
+            android:textColor="@color/color_1a1a1a"
+            android:textSize="@dimen/dp_18"
+            android:textStyle="bold"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/iv_top" />
+
+
+        <com.cooleshow.base.widgets.MaxHeightScrollView
+            android:id="@+id/scroll_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:adjustViewBounds="true"
+            android:background="@color/white"
+            android:scrollbars="none"
+            app:layout_constraintBottom_toTopOf="@+id/versionchecklib_version_dialog_cancel"
+            app:layout_constraintStart_toStartOf="@id/tv_title"
+            app:layout_constraintTop_toBottomOf="@id/tv_title">
+
+            <TextView
+                android:id="@+id/tv_content"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:lineSpacingExtra="@dimen/dp_5"
+                android:paddingStart="@dimen/dp_35"
+                android:paddingTop="@dimen/dp_8"
+                android:paddingEnd="@dimen/dp_35"
+                android:paddingBottom="@dimen/dp_36"
+                android:text=""
+                android:textColor="@color/color_1a1a1a"
+                android:textSize="@dimen/dp_15" />
+        </com.cooleshow.base.widgets.MaxHeightScrollView>
+
+        <TextView
+            android:id="@+id/versionchecklib_version_dialog_cancel"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:background="@drawable/bg_gray_left_bottom_10dp_shape"
+            android:gravity="center"
+            android:paddingTop="@dimen/dp_13"
+            android:paddingBottom="@dimen/dp_13"
+            android:text="暂不更新"
+            android:textColor="@color/colorPrimaryStudent"
+            android:textSize="@dimen/dp_16"
+            android:textStyle="bold"
+            app:layout_constraintEnd_toStartOf="@+id/versionchecklib_version_dialog_commit"
+            app:layout_constraintHorizontal_chainStyle="spread_inside"
+            app:layout_constraintHorizontal_weight="1"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/scroll_layout" />
+
+        <TextView
+            android:id="@+id/versionchecklib_version_dialog_commit"
+            android:layout_width="0dp"
+            android:layout_height="wrap_content"
+            android:background="@drawable/bg_green_right_bottom_10dp_shape"
+            android:gravity="center"
+            android:paddingTop="@dimen/dp_13"
+            android:paddingBottom="@dimen/dp_13"
+            android:text="抢先体验"
+            android:textColor="@color/white"
+            android:textSize="@dimen/dp_16"
+            android:textStyle="bold"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintHorizontal_weight="1"
+            app:layout_constraintStart_toEndOf="@+id/versionchecklib_version_dialog_cancel"
+            app:layout_constraintTop_toTopOf="@+id/versionchecklib_version_dialog_cancel" />
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</LinearLayout>

+ 89 - 0
BaseLibrary/src/main/res/layout/custom_dialog_two_layout.xml

@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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="@android:color/transparent"
+    android:gravity="center"
+    android:orientation="vertical">
+
+    <androidx.constraintlayout.widget.ConstraintLayout
+        android:layout_width="@dimen/dp_272"
+        android:layout_height="wrap_content">
+
+        <ImageView
+            android:id="@+id/iv_top"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginTop="15dp"
+            android:layout_marginBottom="15dp"
+            android:background="@mipmap/iccustom_dialog_top_bg"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+
+        <TextView
+            android:id="@+id/tv_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="@color/white"
+            android:gravity="center"
+            android:paddingTop="@dimen/dp_26"
+            android:text="V3.1.4新版本抢先体验"
+            android:textColor="@color/color_1a1a1a"
+            android:textSize="@dimen/dp_18"
+            android:textStyle="bold"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/iv_top" />
+
+        <com.cooleshow.base.widgets.MaxHeightScrollView
+            android:id="@+id/scroll_layout"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:adjustViewBounds="true"
+            android:background="@color/white"
+            android:scrollbars="none"
+            app:layout_constraintStart_toStartOf="@id/tv_title"
+            app:layout_constraintTop_toBottomOf="@id/tv_title">
+
+            <TextView
+                android:id="@+id/tv_content"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:lineSpacingExtra="@dimen/dp_5"
+                android:paddingStart="@dimen/dp_35"
+                android:paddingTop="@dimen/dp_8"
+                android:paddingEnd="@dimen/dp_35"
+                android:paddingBottom="@dimen/dp_36"
+                android:text=""
+                android:textColor="@color/color_1a1a1a"
+                android:textSize="@dimen/dp_15" />
+        </com.cooleshow.base.widgets.MaxHeightScrollView>
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@drawable/bg_white_bottom_10dp"
+            app:layout_constraintTop_toBottomOf="@id/scroll_layout">
+
+            <TextView
+                android:id="@id/versionchecklib_version_dialog_commit"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_42"
+                android:layout_marginStart="@dimen/dp_24"
+                android:layout_marginEnd="@dimen/dp_24"
+                android:layout_marginBottom="@dimen/dp_11"
+                android:background="@drawable/shape_2dc7aa_39dp"
+                android:gravity="center"
+                android:text="立即体验"
+                android:textColor="@color/white"
+                android:textSize="@dimen/dp_16"
+                android:textStyle="bold" />
+
+        </LinearLayout>
+
+
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</LinearLayout>

+ 70 - 0
BaseLibrary/src/main/res/layout/custom_download_failed_dialog.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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"
+    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:background="@drawable/bg_white_10dp">
+
+        <ImageView
+            android:id="@+id/versionchecklib_failed_dialog_cancel"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:padding="@dimen/dp_18"
+            android:src="@drawable/ic_gray_close"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <ImageView
+            android:id="@+id/iv_bg"
+            android:layout_width="227dp"
+            android:layout_height="187dp"
+            android:layout_gravity="center"
+            android:layout_marginStart="@dimen/dp_21"
+            android:layout_marginTop="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:background="@mipmap/ic_custom_download_failed_bg"
+            android:padding="@dimen/dp_18"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/dp_15"
+            android:text="下载失败,请重新下载"
+            android:textColor="@color/gray_ff80"
+
+            android:textSize="@dimen/dp_15"
+            app:layout_constraintBottom_toBottomOf="@id/iv_bg"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@+id/versionchecklib_failed_dialog_retry"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_42"
+            android:layout_marginStart="@dimen/dp_24"
+            android:layout_marginTop="@dimen/dp_29"
+            android:layout_marginEnd="@dimen/dp_24"
+            android:layout_marginBottom="@dimen/dp_16"
+            android:background="@drawable/shape_2dc7aa_39dp"
+            android:gravity="center"
+            android:text="重新下载"
+            android:textColor="@color/white"
+            android:textSize="@dimen/dp_16"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_hint" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</LinearLayout>

+ 62 - 0
BaseLibrary/src/main/res/layout/custom_download_failed_two_dialog.xml

@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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"
+    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:background="@drawable/bg_white_10dp">
+
+
+
+        <ImageView
+            android:id="@+id/iv_bg"
+            android:layout_width="227dp"
+            android:layout_height="187dp"
+            android:layout_gravity="center"
+            android:layout_marginStart="@dimen/dp_21"
+            android:layout_marginTop="@dimen/dp_21"
+            android:layout_marginEnd="@dimen/dp_21"
+            android:background="@mipmap/ic_custom_download_failed_bg"
+            android:padding="@dimen/dp_18"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <TextView
+            android:id="@+id/tv_hint"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/dp_15"
+            android:text="下载失败,请重新下载"
+            android:textColor="@color/gray_ff80"
+
+            android:textSize="@dimen/dp_15"
+            app:layout_constraintBottom_toBottomOf="@id/iv_bg"
+            app:layout_constraintEnd_toEndOf="parent"
+            app:layout_constraintStart_toStartOf="parent" />
+
+        <TextView
+            android:id="@id/versionchecklib_failed_dialog_retry"
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/dp_42"
+            android:layout_marginStart="@dimen/dp_24"
+            android:layout_marginTop="@dimen/dp_29"
+            android:layout_marginEnd="@dimen/dp_24"
+            android:layout_marginBottom="@dimen/dp_16"
+            android:background="@drawable/shape_2dc7aa_39dp"
+            android:gravity="center"
+            android:text="重新下载"
+            android:textColor="@color/white"
+            android:textSize="@dimen/dp_16"
+            android:textStyle="bold"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintTop_toBottomOf="@id/tv_hint" />
+    </androidx.constraintlayout.widget.ConstraintLayout>
+</LinearLayout>

+ 58 - 0
BaseLibrary/src/main/res/layout/custom_download_layout.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout 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:gravity="center"
+    android:orientation="vertical">
+
+    <LinearLayout
+        android:layout_width="@dimen/dp_272"
+        android:layout_height="wrap_content"
+        android:background="@drawable/bg_white_10dp"
+        android:gravity="center_horizontal"
+        android:orientation="vertical">
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dp_17"
+            android:background="@mipmap/iccustom_download_failed_top_bg" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/dp_13"
+            android:text="正在为您更新,请耐心等待"
+            android:textColor="@color/gray_ff80"
+            android:textSize="@dimen/dp_15" />
+
+        <com.jaygoo.widget.RangeSeekBar
+            android:id="@+id/seek_bar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginStart="@dimen/dp_20"
+            android:layout_marginTop="@dimen/dp_23"
+            android:layout_marginEnd="@dimen/dp_20"
+            android:layout_marginBottom="@dimen/dp_36"
+            app:rsb_indicator_background_color="@color/colorPrimaryStudent"
+            app:rsb_indicator_height="wrap_content"
+            app:rsb_indicator_padding_bottom="5dp"
+            app:rsb_indicator_padding_left="7dp"
+            app:rsb_indicator_padding_right="7dp"
+            app:rsb_indicator_padding_top="5dp"
+            app:rsb_indicator_radius="2dp"
+            android:focusable="false"
+            android:clickable="false"
+            app:rsb_indicator_show_mode="alwaysShow"
+            app:rsb_indicator_text_size="@dimen/dp_12"
+            app:rsb_mode="single"
+            app:rsb_progress_color="@color/colorPrimaryStudent"
+            app:rsb_progress_default_color="#E0E0E0"
+            app:rsb_progress_height="@dimen/dp_3"
+            app:rsb_thumb_drawable="@drawable/thumb_green_alpha_shape"
+            app:rsb_thumb_height="12dp"
+            app:rsb_thumb_width="12dp"
+            app:rsb_tick_mark_mode="number" />
+    </LinearLayout>
+</LinearLayout>

BIN
BaseLibrary/src/main/res/mipmap-xhdpi/ic_custom_download_failed_bg.png


BIN
BaseLibrary/src/main/res/mipmap-xhdpi/iccustom_dialog_top_bg.png


BIN
BaseLibrary/src/main/res/mipmap-xhdpi/iccustom_download_failed_top_bg.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/ic_custom_download_failed_bg.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/iccustom_dialog_top_bg.png


BIN
BaseLibrary/src/main/res/mipmap-xxhdpi/iccustom_download_failed_top_bg.png


+ 5 - 0
BaseLibrary/src/main/res/values/attrs.xml

@@ -54,4 +54,9 @@
         <attr name="right_title_visible" format="boolean" />
         <attr name="right_title_text" format="string" />
     </declare-styleable>
+
+    <declare-styleable name="MaxHeightScrollView">
+
+        <attr name="max_height" format="dimension|reference" />
+    </declare-styleable>
 </resources>

+ 4 - 0
student/build.gradle

@@ -72,6 +72,10 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+
+    packagingOptions {
+        exclude 'META-INF/library_release.kotlin_module'
+    }
     kotlinOptions {
         jvmTarget = '1.8'
     }

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

@@ -28,6 +28,7 @@ import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.UpdateAppHelper;
 import com.cooleshow.student.R;
 import com.cooleshow.student.adapter.HomePageAdapter;
 import com.cooleshow.student.contract.MainContract;
@@ -93,8 +94,14 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
         QMUIStatusBarHelper.setStatusBarLightMode(this);
         EventBus.getDefault().register(this);
         parseIntent(getIntent());
+        checkAppVersion();
     }
 
+    private void checkAppVersion() {
+        UpdateAppHelper.getInstance().checkUpdate(this, "android-student");
+    }
+
+
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
@@ -112,7 +119,7 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
             return;
         }
         String intentResult = PushIntentParseHelper.getIntentMemoFrom(intent);
-        LogUtils.i("pq","intentResult:"+intentResult);
+        LogUtils.i("pq", "intentResult:" + intentResult);
         if (!TextUtils.isEmpty(intentResult)) {
             if (TextUtils.equals(intentResult, PushIntentParseHelper.RONG_PUSH_ACTION_TAG)) {
                 //融云推送相关

+ 10 - 0
student/src/main/java/com/cooleshow/student/ui/mine/AboutActivity.java

@@ -1,15 +1,19 @@
 package com.cooleshow.student.ui.mine;
 
+import android.os.Bundle;
 import android.view.View;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.AppUtils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.student.contract.AboutContract;
 import com.cooleshow.student.databinding.ActivityAboutBinding;
 import com.cooleshow.student.presenter.mine.AboutPresenter;
 
+import androidx.annotation.Nullable;
+
 /**
  * 创建日期:2022/5/18 14:08
  *
@@ -20,6 +24,12 @@ import com.cooleshow.student.presenter.mine.AboutPresenter;
 public class AboutActivity extends BaseMVPActivity<ActivityAboutBinding, AboutPresenter> implements AboutContract.AboutView, View.OnClickListener {
 
     @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+    @Override
     public void onClick(View view) {
 
     }

+ 3 - 0
teacher/build.gradle

@@ -79,6 +79,9 @@ android {
         sourceCompatibility JavaVersion.VERSION_1_8
         targetCompatibility JavaVersion.VERSION_1_8
     }
+    packagingOptions {
+        exclude 'META-INF/library_release.kotlin_module'
+    }
     kotlinOptions {
         jvmTarget = '1.8'
     }

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

@@ -24,6 +24,7 @@ import com.cooleshow.base.utils.JumpUtils;
 import com.cooleshow.base.utils.LogUtils;
 import com.cooleshow.base.utils.ToastUtil;
 import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
+import com.cooleshow.base.utils.helper.UpdateAppHelper;
 import com.cooleshow.teacher.R;
 import com.cooleshow.teacher.adapter.HomePageAdapter;
 import com.cooleshow.teacher.bean.TeacherUserInfo;
@@ -92,8 +93,14 @@ public class MainActivity extends BaseMVPActivity<ActivityMainBinding, MainPrese
         QMUIStatusBarHelper.setStatusBarLightMode(this);
         EventBus.getDefault().register(this);
         parseIntent(getIntent());
+        checkAppVersion();
     }
 
+    private void checkAppVersion() {
+        UpdateAppHelper.getInstance().checkUpdate(this, "android-teacher");
+    }
+
+
     @NonNull
     @Override
     protected ActivityMainBinding getLayoutView() {

+ 10 - 0
teacher/src/main/java/com/cooleshow/teacher/ui/mine/AboutActivity.java

@@ -1,15 +1,19 @@
 package com.cooleshow.teacher.ui.mine;
 
+import android.os.Bundle;
 import android.view.View;
 
 import com.alibaba.android.arouter.facade.annotation.Route;
 import com.cooleshow.base.router.RouterPath;
 import com.cooleshow.base.ui.activity.BaseMVPActivity;
 import com.cooleshow.base.utils.AppUtils;
+import com.cooleshow.base.utils.helper.QMUIStatusBarHelper;
 import com.cooleshow.teacher.contract.AboutContract;
 import com.cooleshow.teacher.databinding.ActivityAboutBinding;
 import com.cooleshow.teacher.presenter.mine.AboutPresenter;
 
+import androidx.annotation.Nullable;
+
 /**
  * 创建日期:2022/5/18 14:08
  *
@@ -20,6 +24,12 @@ import com.cooleshow.teacher.presenter.mine.AboutPresenter;
 public class AboutActivity extends BaseMVPActivity<ActivityAboutBinding, AboutPresenter> implements AboutContract.AboutView, View.OnClickListener {
 
     @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        QMUIStatusBarHelper.setStatusBarLightMode(this);
+    }
+
+    @Override
     public void onClick(View view) {
 
     }

+ 6 - 2
teacher/src/main/java/com/cooleshow/teacher/ui/score/MineScoreActivity.java

@@ -70,7 +70,7 @@ public class MineScoreActivity extends BaseMVPActivity<ActivityMineScoreBinding,
         switch (view.getId()) {
             case R.id.tv_right:
                 if (!TextUtils.equals(musicianAuthStatus, TeacherInfoConstants.MUSICIAN_STATUS_PASS)) {
-                    ToastUtil.getInstance().show(this, "您还没有上传曲谱");
+                    ToastUtil.getInstance().show(this, "您还未通过音乐人认证");
                     return;
                 }
                 presenter.musicSheetShare();
@@ -186,7 +186,11 @@ public class MineScoreActivity extends BaseMVPActivity<ActivityMineScoreBinding,
 
     @Override
     public void musicSheetShareSuccess(MusicSheetShareBean data) {
-        showScoreShareDialog(data);
+        if (data != null && data.musicSheetCount > 0) {
+            showScoreShareDialog(data);
+        } else {
+            ToastUtil.getInstance().show(this, "您还没有上架曲谱");
+        }
     }
 
     @Override