检测版本更新App

This commit is contained in:
fengjignqi
2026-07-02 08:45:59 +08:00
parent b5e9f0de3b
commit d2610d5b61
19 changed files with 251 additions and 66 deletions

View File

@@ -19,6 +19,7 @@ import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
@@ -48,8 +49,10 @@ public class DialogAppUpdate {
public static View layoutView;
private Dialog mDialog;
private Activity mContext;
private TextView tvTitle,tvContent,tvConfirm,tvCancel;
private TextView tvTitle,tvContent,tvConfirm,tvCancel,tvVersionName;
private TextView tvProgressPercent;
private RelativeLayout rlUpdateContent;
private LinearLayout llProgressContainer,llButton;
private ImageView imgClose,imgClear;
private String startTime = "";
private String endTime = "";
@@ -84,7 +87,7 @@ public class DialogAppUpdate {
this.mContext = context;
this.mIsForceUpdate = isForceUpdate;
this.mVersionBean = bean;
mDwonLoadUrl = bean.getVersionUrl();
mDwonLoadUrl = bean.getDownloadUrl();
mDialog = new Dialog(context, R.style.ActionSheetDialogStyle);
//填充对话框的布局
layoutView = LayoutInflater.from(context).inflate(layoutId, null);
@@ -122,29 +125,28 @@ public class DialogAppUpdate {
dialogWindow.setAttributes(lp);
}
tvTitle = layoutView.findViewById(R.id.tv_title);
tvVersionName = layoutView.findViewById(R.id.tv_version);
tvContent = layoutView.findViewById(R.id.tv_update_content);
tvConfirm = layoutView.findViewById(R.id.tv_update);
tvCancel = layoutView.findViewById(R.id.tv_cencel);
tvCancel = layoutView.findViewById(R.id.tv_cancel);
progressBar = layoutView.findViewById(R.id.progress_bar);
rlUpdateContent = layoutView.findViewById(R.id.rel_file_content);
llProgressContainer = layoutView.findViewById(R.id.ll_progress_container);
llButton = layoutView.findViewById(R.id.Linear_button);
tvConfirm.setOnClickListener(onclick);
tvCancel.setOnClickListener(onclick);
if(isForceUpdate){
tvCancel.setVisibility(View.GONE);
}
// 初始化 DownloadManager
downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
tvVersionName.setText(bean.getLatestVersion());
// 解析更新说明支持纯文本和HTML格式
String releaseNotes = bean.getReleaseNotes();
releaseNotes = releaseNotes.replace("\n", "<br>");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
tvContent.setText(Html.fromHtml(bean.getVersionDescription(), Html.FROM_HTML_MODE_LEGACY));
tvContent.setText(Html.fromHtml(releaseNotes, Html.FROM_HTML_MODE_LEGACY));
} else {
tvContent.setText(Html.fromHtml(releaseNotes));
}
String [] desStr = bean.getVersionDescription().split("#");
String desLine = "";
for(String str : desStr){
desLine = desLine + str + "\n";
}
tvContent.setText(desLine);
tvContent.setLineSpacing(0, 1.2f);
}
@@ -165,7 +167,7 @@ public class DialogAppUpdate {
}
startUpdateApp();
break;
case R.id.tv_cencel:
case R.id.tv_cancel:
dismiss();
AppConfig.USER_CONFIRM_UPDATE_APP = true;
break;
@@ -176,8 +178,8 @@ public class DialogAppUpdate {
public void startUpdateApp() {
//强制更新不需要隐藏dialog
if(mIsForceUpdate){
progressBar.setVisibility(View.VISIBLE);
rlUpdateContent.setVisibility(View.GONE);
llProgressContainer.setVisibility(View.VISIBLE);
llButton.setVisibility(View.GONE);
progressBar.setMax(100);
}else{
ToastUtil.showShort(mContext,"可在任务栏查看下载进度");

View File

@@ -276,7 +276,8 @@ public class IndexFragment extends BaseFragment<IndexFragmentLayoutBinding, Inde
case 302:
// 这是一台没有在mqtt中注册的设备需要通过蓝牙连接配网,(可理解为新设备,走蓝牙,配网)
// 先检查蓝牙权限和开启状态
pendingDeviceEntity = entity;
checkBluetoothAndProceed();
break;

View File

@@ -12,7 +12,7 @@ import java.util.Map;
public interface MainContract {
interface DataModel{
//新版本检测
void checkAppVersionCode(JSONObject json, CallBack callBack);
void checkAppVersionCode(Map<String,String> map, CallBack callBack);
//运势
void getYunshiData(Map<String,Object> map, CallBack callBack);
}

View File

@@ -20,13 +20,13 @@ public class MainImpl implements MainContract.DataModel{
/**
* 检测新版本
* @param jsonObject
* @param map
* @param callBack
*/
@Override
public void checkAppVersionCode(JSONObject jsonObject, MainContract.CallBack callBack) {
public void checkAppVersionCode(Map<String,String> map, MainContract.CallBack callBack) {
try {
NetWorkManager.getRequest().checkVersionCode(NetWorkManager.getToken(),NetWorkManager.toRequestBody(jsonObject))
NetWorkManager.getRequest().checkVersionCode(NetWorkManager.getToken(),map)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())

View File

@@ -1,5 +1,6 @@
package com.ckkj.water.main;
import com.ckkj.water.BuildConfig;
import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.main.entity.CheckVersionEntity;
@@ -20,8 +21,10 @@ public class MainPresenter extends BasePresenter<MainContract.MainView> {
* 获取用户信息
*/
public void checkNewVersion() {
JSONObject json = new JSONObject();
mainImpl.checkAppVersionCode(json, new MainContract.CallBack<CheckVersionEntity>() {
Map<String,String> map = new HashMap<>();
map.put("platform","android");
map.put("currentVersion", BuildConfig.APP_VERSION_NAME);
mainImpl.checkAppVersionCode(map, new MainContract.CallBack<CheckVersionEntity>() {
@Override
public void success(CheckVersionEntity bean) {
if( MainPresenter.this.getView() != null){

View File

@@ -103,7 +103,7 @@ public class MainActivity extends BaseActivity<MainActivityLayoutBinding, MainPr
@Override
public void initData(Bundle savedInstanceState) {
super.initData(savedInstanceState);
// mPresenter.checkNewVersion();
mPresenter.checkNewVersion();
// 清空Fragment列表避免状态恢复问题
mFragmentList.clear();
mFragmentList.add(new IndexFragment());
@@ -356,16 +356,16 @@ public class MainActivity extends BaseActivity<MainActivityLayoutBinding, MainPr
if(bean == null){
return;
}
if(bean.getVersionCoercion().equals("0")){//不强制
if(!bean.isForceUpdate()){//不强制
isForceUpdate = false;
}else{
isForceUpdate = true;
}
//前期强制更新
// isForceUpdate = true;
if(bean.getVersionNumber() > versionCode){
if(bean.getVersionCode() > versionCode){
//App更新dialog
mUpdateDialog = new DialogAppUpdate(mContext,R.layout.dialog_app_update,isForceUpdate,bean);
mUpdateDialog = new DialogAppUpdate(mContext,R.layout.dialog_app_update_water,isForceUpdate,bean);
mUpdateDialog.show();
mUpdateDialog.setOnDialogListener(new DialogAppUpdate.DialogListener() {
@Override

View File

@@ -1,41 +1,32 @@
package com.ckkj.water.main.entity;
import com.google.gson.annotations.SerializedName;
import java.io.Serializable;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
@NoArgsConstructor
public class CheckVersionEntity implements Serializable {
@SerializedName("versionNumber")
private int versionNumber;
@SerializedName("versionEnd")
private String versionEnd;
@SerializedName("versionCoercion")
private String versionCoercion;
@SerializedName("versionDescription")
private String versionDescription;
@SerializedName("versionName")
private String versionName;
@SerializedName("versionUrl")
private String versionUrl;
@SerializedName("versionHide1")
private String versionHide1;
@SerializedName("versionHide2")
private String versionHide2;
@SerializedName("versionHide3")
private String versionHide3;
@SerializedName("versionHide4")
private String versionHide4;
@SerializedName("versionHide5")
private Object versionHide5;
@SerializedName("versionHide6")
private Object versionHide6;
@SerializedName("paipanApiKey")
private String paipanApiKey;
/**
* platform : android
* currentVersion : 1.0.1
* latestVersion : 1.0.0
* versionCode : 1
* updateAvailable : true
* forceUpdate : false
* downloadUrl : null
* releaseNotes : null
*/
private String platform;
private String currentVersion;
private String latestVersion;
private int versionCode;
private boolean updateAvailable;
private boolean forceUpdate;
private String downloadUrl;
private String releaseNotes;
}

View File

@@ -6,6 +6,7 @@ import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import com.bumptech.glide.Glide;
import com.ckkj.water.AppConfig;
import com.ckkj.water.ConstantUtil;
import com.ckkj.water.R;
@@ -143,6 +144,13 @@ public class MineCenterFragment extends BaseFragment<MineFragmentLayoutBinding,
}else{
viewBinding.tvUserAccount.setText(bean.getUser().getPhonenumber());
}
if(!TextUtils.isEmpty(bean.getUser().getAvatar())){
// 刷新头像显示
Glide.with(mContext)
.load(bean.getUser().getAvatar())
.error(mContext.getDrawable(R.mipmap.icon_mine_user_head_defaul))
.into(viewBinding.imgAvatar);
}
}
/**

View File

@@ -140,7 +140,7 @@ public class MineInfomationActivity extends BaseActivity<MineInformationLayoutBi
@Override
public void onConfirmClisk(String content) {
showLoadingDialog();
mPresenter.updateUserInfo(content);
mPresenter.updateUserInfo(content,null);
mUserBean.getUser().setNickName(content);
viewBinding.tvNicknameValue.setText(content);
}

View File

@@ -66,7 +66,7 @@ public class MineUserInfoBean implements Serializable {
private String email;
private String phonenumber;
private String sex;
private Object avatar;
private String avatar;
private String password;
private String status;
private String loginIp;

View File

@@ -1,5 +1,7 @@
package com.ckkj.water.mine.mvp;
import android.text.TextUtils;
import com.ckkj.water.base.BasePresenter;
import com.ckkj.water.mine.entity.MineUserInfoBean;
import com.ckkj.water.login.mvp.LoginContract;
@@ -51,12 +53,18 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
/**
* 修改用户信息
* @param content
* @param nickName
* @param avatar
*/
public void updateUserInfo(String content) {
public void updateUserInfo(String nickName,String avatar) {
try {
JSONObject json = new JSONObject();
json.put("nickName", content);
if(!TextUtils.isEmpty(avatar)){
json.put("nickName", nickName);
}
if(!TextUtils.isEmpty(avatar)){
json.put("avatar", avatar);
}
impl.updateUserInfo(json, new MineContract.CallBack<BaseBean>() {
@Override
public void success(BaseBean bean) {
@@ -142,6 +150,7 @@ public class MinePresenter extends BasePresenter<MineContract.MineView> {
public void success(MineUserInfoBean bean) {
if (MinePresenter.this.getView() != null) {
MinePresenter.this.getView().uploadImageSuccess(bean);
updateUserInfo(null,bean.getUrl());
}
}

View File

@@ -148,8 +148,8 @@ public interface Request {
@POST("mobile/version?end=android")
Observable<BaseBean<CheckVersionEntity>> checkVersionCode(@HeaderMap Map<String, String> headMap, @Body RequestBody requestBody);
@GET("app/v1/checkVersion")
Observable<BaseBean<CheckVersionEntity>> checkVersionCode(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, String> map);
//版本检测更新
@POST("mine/api/versionNum")
Observable<BaseBean<CheckVersionEntity>> getVersionCheck(@HeaderMap Map<String, String> headMap, @QueryMap Map<String, Object> map);