| 
					
				 | 
			
			
				@@ -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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |