diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + + @@ -100,6 +101,7 @@ + + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt index d6ef778..7230b80 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt @@ -1,21 +1,34 @@ package com.casic.xz.meterage.view import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log import android.view.View +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.BuildConfig import com.casic.xz.meterage.R import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.appendDownloadUrl import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.FileViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.callback.OnDownloadListener +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.downloadFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_version_control.* import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class VersionControlActivity : ApplicationBaseActivity() { + private val kTag = "VersionControlActivity" private lateinit var fileViewModel: FileViewModel private lateinit var progressDialog: ProgressDialog @@ -39,26 +52,31 @@ fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] fileViewModel.versionResult.observe(this) { -// if (BuildConfig.VERSION_NAME == it.version) { -// "已是最新版本,无需更新".show(this) -// } else { -// AlertControlDialog.Builder() -// .setContext(this) -// .setTitle("提示") -// .setMessage("有新版本,是否更新?") -// .setNegativeButton("稍后再说") -// .setPositiveButton("立即下载") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// downloadApk(it.downloadUrl) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } + if (it.code == 200) { + //后台已经倒序,取第一个即可 + val first = it.data.rows.first() + + if (BuildConfig.VERSION_NAME == first.versionName) { + "已是最新版本,无需更新".show(this) + } else { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(first.minioFileName) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } } } @@ -70,16 +88,72 @@ leftBackView.setOnClickListener { finish() } introduceLayout.setOnClickListener { - "未实现".show(this) + navigatePageTo() } updateLayout.setOnClickListener { -// fileViewModel.updateVersion() - "未实现".show(this) + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), 1) } privacyView.setOnClickListener { navigatePageTo() } } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show(this) + return + } + /** + * http://111.198.10.15:21408/test/202301121601_1682236842001.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + Log.d(kTag, "downloadApk => $downloadPath") + //开始下载 + downloadPath.downloadFile( + this.createDownloadFileDir().toString(), object : OnDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + } + ) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show(this) + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + this, LocaleConstant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt index d6ef778..7230b80 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt @@ -1,21 +1,34 @@ package com.casic.xz.meterage.view import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log import android.view.View +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.BuildConfig import com.casic.xz.meterage.R import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.appendDownloadUrl import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.FileViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.callback.OnDownloadListener +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.downloadFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_version_control.* import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class VersionControlActivity : ApplicationBaseActivity() { + private val kTag = "VersionControlActivity" private lateinit var fileViewModel: FileViewModel private lateinit var progressDialog: ProgressDialog @@ -39,26 +52,31 @@ fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] fileViewModel.versionResult.observe(this) { -// if (BuildConfig.VERSION_NAME == it.version) { -// "已是最新版本,无需更新".show(this) -// } else { -// AlertControlDialog.Builder() -// .setContext(this) -// .setTitle("提示") -// .setMessage("有新版本,是否更新?") -// .setNegativeButton("稍后再说") -// .setPositiveButton("立即下载") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// downloadApk(it.downloadUrl) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } + if (it.code == 200) { + //后台已经倒序,取第一个即可 + val first = it.data.rows.first() + + if (BuildConfig.VERSION_NAME == first.versionName) { + "已是最新版本,无需更新".show(this) + } else { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(first.minioFileName) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } } } @@ -70,16 +88,72 @@ leftBackView.setOnClickListener { finish() } introduceLayout.setOnClickListener { - "未实现".show(this) + navigatePageTo() } updateLayout.setOnClickListener { -// fileViewModel.updateVersion() - "未实现".show(this) + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), 1) } privacyView.setOnClickListener { navigatePageTo() } } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show(this) + return + } + /** + * http://111.198.10.15:21408/test/202301121601_1682236842001.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + Log.d(kTag, "downloadApk => $downloadPath") + //开始下载 + downloadPath.downloadFile( + this.createDownloadFileDir().toString(), object : OnDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + } + ) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show(this) + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + this, LocaleConstant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt new file mode 100644 index 0000000..bc519cd --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt @@ -0,0 +1,148 @@ +package com.casic.xz.meterage.view + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.VersionResultModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.FileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_version_history.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class VersionHistoryActivity : ApplicationBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var fileViewModel: FileViewModel + private lateinit var versionHistoryAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_version_history + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "功能介绍" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + fileViewModel.versionResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + versionHistoryLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + versionHistoryLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042401) + } + } + } + + override fun observeRequestState() { + fileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + versionHistoryLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getApkVersionListByPage() + } + + versionHistoryLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getApkVersionListByPage() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getApkVersionListByPage() + } + + private fun getApkVersionListByPage() { + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023042401 -> { + if (isRefresh || isLoadMore) { + versionHistoryAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("无APP版本更新记录") { + pageIndex = 1 + getApkVersionListByPage() + } + } else { + emptyView.hide() + versionHistoryAdapter = object : + NormalRecyclerAdapter( + R.layout.item_update_log_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: VersionResultModel.DataModel.RowsModel + ) { + viewHolder.setText( + R.id.versionNameView, + "${resources.getString(R.string.app_name)} ${item.versionName} 主要更新" + ) + .setText(R.id.descriptionView, item.descn) + //2023-04-23T17:06:06 + .setText(R.id.dateView, item.updateTime.split("T")[0]) + } + } + versionHistoryRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + versionHistoryRecyclerView.adapter = versionHistoryAdapter + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt index d6ef778..7230b80 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt @@ -1,21 +1,34 @@ package com.casic.xz.meterage.view import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log import android.view.View +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.BuildConfig import com.casic.xz.meterage.R import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.appendDownloadUrl import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.FileViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.callback.OnDownloadListener +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.downloadFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_version_control.* import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class VersionControlActivity : ApplicationBaseActivity() { + private val kTag = "VersionControlActivity" private lateinit var fileViewModel: FileViewModel private lateinit var progressDialog: ProgressDialog @@ -39,26 +52,31 @@ fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] fileViewModel.versionResult.observe(this) { -// if (BuildConfig.VERSION_NAME == it.version) { -// "已是最新版本,无需更新".show(this) -// } else { -// AlertControlDialog.Builder() -// .setContext(this) -// .setTitle("提示") -// .setMessage("有新版本,是否更新?") -// .setNegativeButton("稍后再说") -// .setPositiveButton("立即下载") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// downloadApk(it.downloadUrl) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } + if (it.code == 200) { + //后台已经倒序,取第一个即可 + val first = it.data.rows.first() + + if (BuildConfig.VERSION_NAME == first.versionName) { + "已是最新版本,无需更新".show(this) + } else { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(first.minioFileName) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } } } @@ -70,16 +88,72 @@ leftBackView.setOnClickListener { finish() } introduceLayout.setOnClickListener { - "未实现".show(this) + navigatePageTo() } updateLayout.setOnClickListener { -// fileViewModel.updateVersion() - "未实现".show(this) + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), 1) } privacyView.setOnClickListener { navigatePageTo() } } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show(this) + return + } + /** + * http://111.198.10.15:21408/test/202301121601_1682236842001.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + Log.d(kTag, "downloadApk => $downloadPath") + //开始下载 + downloadPath.downloadFile( + this.createDownloadFileDir().toString(), object : OnDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + } + ) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show(this) + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + this, LocaleConstant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt new file mode 100644 index 0000000..bc519cd --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt @@ -0,0 +1,148 @@ +package com.casic.xz.meterage.view + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.VersionResultModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.FileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_version_history.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class VersionHistoryActivity : ApplicationBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var fileViewModel: FileViewModel + private lateinit var versionHistoryAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_version_history + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "功能介绍" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + fileViewModel.versionResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + versionHistoryLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + versionHistoryLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042401) + } + } + } + + override fun observeRequestState() { + fileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + versionHistoryLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getApkVersionListByPage() + } + + versionHistoryLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getApkVersionListByPage() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getApkVersionListByPage() + } + + private fun getApkVersionListByPage() { + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023042401 -> { + if (isRefresh || isLoadMore) { + versionHistoryAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("无APP版本更新记录") { + pageIndex = 1 + getApkVersionListByPage() + } + } else { + emptyView.hide() + versionHistoryAdapter = object : + NormalRecyclerAdapter( + R.layout.item_update_log_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: VersionResultModel.DataModel.RowsModel + ) { + viewHolder.setText( + R.id.versionNameView, + "${resources.getString(R.string.app_name)} ${item.versionName} 主要更新" + ) + .setText(R.id.descriptionView, item.descn) + //2023-04-23T17:06:06 + .setText(R.id.dateView, item.updateTime.split("T")[0]) + } + } + versionHistoryRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + versionHistoryRecyclerView.adapter = versionHistoryAdapter + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt index a4d78eb..348183f 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt @@ -41,9 +41,13 @@ it.printStackTrace() }) - fun updateVersion() = launch({ + fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.updateVersion() + val response = RetrofitServiceManager.getApkVersionList( + fileName, downloadNo, moduleName, ids, offset + ) val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt index d6ef778..7230b80 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt @@ -1,21 +1,34 @@ package com.casic.xz.meterage.view import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log import android.view.View +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.BuildConfig import com.casic.xz.meterage.R import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.appendDownloadUrl import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.FileViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.callback.OnDownloadListener +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.downloadFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_version_control.* import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class VersionControlActivity : ApplicationBaseActivity() { + private val kTag = "VersionControlActivity" private lateinit var fileViewModel: FileViewModel private lateinit var progressDialog: ProgressDialog @@ -39,26 +52,31 @@ fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] fileViewModel.versionResult.observe(this) { -// if (BuildConfig.VERSION_NAME == it.version) { -// "已是最新版本,无需更新".show(this) -// } else { -// AlertControlDialog.Builder() -// .setContext(this) -// .setTitle("提示") -// .setMessage("有新版本,是否更新?") -// .setNegativeButton("稍后再说") -// .setPositiveButton("立即下载") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// downloadApk(it.downloadUrl) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } + if (it.code == 200) { + //后台已经倒序,取第一个即可 + val first = it.data.rows.first() + + if (BuildConfig.VERSION_NAME == first.versionName) { + "已是最新版本,无需更新".show(this) + } else { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(first.minioFileName) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } } } @@ -70,16 +88,72 @@ leftBackView.setOnClickListener { finish() } introduceLayout.setOnClickListener { - "未实现".show(this) + navigatePageTo() } updateLayout.setOnClickListener { -// fileViewModel.updateVersion() - "未实现".show(this) + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), 1) } privacyView.setOnClickListener { navigatePageTo() } } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show(this) + return + } + /** + * http://111.198.10.15:21408/test/202301121601_1682236842001.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + Log.d(kTag, "downloadApk => $downloadPath") + //开始下载 + downloadPath.downloadFile( + this.createDownloadFileDir().toString(), object : OnDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + } + ) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show(this) + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + this, LocaleConstant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt new file mode 100644 index 0000000..bc519cd --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt @@ -0,0 +1,148 @@ +package com.casic.xz.meterage.view + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.VersionResultModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.FileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_version_history.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class VersionHistoryActivity : ApplicationBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var fileViewModel: FileViewModel + private lateinit var versionHistoryAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_version_history + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "功能介绍" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + fileViewModel.versionResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + versionHistoryLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + versionHistoryLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042401) + } + } + } + + override fun observeRequestState() { + fileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + versionHistoryLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getApkVersionListByPage() + } + + versionHistoryLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getApkVersionListByPage() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getApkVersionListByPage() + } + + private fun getApkVersionListByPage() { + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023042401 -> { + if (isRefresh || isLoadMore) { + versionHistoryAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("无APP版本更新记录") { + pageIndex = 1 + getApkVersionListByPage() + } + } else { + emptyView.hide() + versionHistoryAdapter = object : + NormalRecyclerAdapter( + R.layout.item_update_log_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: VersionResultModel.DataModel.RowsModel + ) { + viewHolder.setText( + R.id.versionNameView, + "${resources.getString(R.string.app_name)} ${item.versionName} 主要更新" + ) + .setText(R.id.descriptionView, item.descn) + //2023-04-23T17:06:06 + .setText(R.id.dateView, item.updateTime.split("T")[0]) + } + } + versionHistoryRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + versionHistoryRecyclerView.adapter = versionHistoryAdapter + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt index a4d78eb..348183f 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt @@ -41,9 +41,13 @@ it.printStackTrace() }) - fun updateVersion() = launch({ + fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.updateVersion() + val response = RetrofitServiceManager.getApkVersionList( + fileName, downloadNo, moduleName, ids, offset + ) val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml index c800091..ebb7bc3 100644 --- a/app/src/main/res/drawable/download_progress.xml +++ b/app/src/main/res/drawable/download_progress.xml @@ -3,8 +3,8 @@ - - + + @@ -12,8 +12,8 @@ - - + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt index d6ef778..7230b80 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt @@ -1,21 +1,34 @@ package com.casic.xz.meterage.view import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log import android.view.View +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.BuildConfig import com.casic.xz.meterage.R import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.appendDownloadUrl import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.FileViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.callback.OnDownloadListener +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.downloadFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_version_control.* import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class VersionControlActivity : ApplicationBaseActivity() { + private val kTag = "VersionControlActivity" private lateinit var fileViewModel: FileViewModel private lateinit var progressDialog: ProgressDialog @@ -39,26 +52,31 @@ fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] fileViewModel.versionResult.observe(this) { -// if (BuildConfig.VERSION_NAME == it.version) { -// "已是最新版本,无需更新".show(this) -// } else { -// AlertControlDialog.Builder() -// .setContext(this) -// .setTitle("提示") -// .setMessage("有新版本,是否更新?") -// .setNegativeButton("稍后再说") -// .setPositiveButton("立即下载") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// downloadApk(it.downloadUrl) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } + if (it.code == 200) { + //后台已经倒序,取第一个即可 + val first = it.data.rows.first() + + if (BuildConfig.VERSION_NAME == first.versionName) { + "已是最新版本,无需更新".show(this) + } else { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(first.minioFileName) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } } } @@ -70,16 +88,72 @@ leftBackView.setOnClickListener { finish() } introduceLayout.setOnClickListener { - "未实现".show(this) + navigatePageTo() } updateLayout.setOnClickListener { -// fileViewModel.updateVersion() - "未实现".show(this) + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), 1) } privacyView.setOnClickListener { navigatePageTo() } } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show(this) + return + } + /** + * http://111.198.10.15:21408/test/202301121601_1682236842001.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + Log.d(kTag, "downloadApk => $downloadPath") + //开始下载 + downloadPath.downloadFile( + this.createDownloadFileDir().toString(), object : OnDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + } + ) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show(this) + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + this, LocaleConstant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt new file mode 100644 index 0000000..bc519cd --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt @@ -0,0 +1,148 @@ +package com.casic.xz.meterage.view + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.VersionResultModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.FileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_version_history.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class VersionHistoryActivity : ApplicationBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var fileViewModel: FileViewModel + private lateinit var versionHistoryAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_version_history + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "功能介绍" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + fileViewModel.versionResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + versionHistoryLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + versionHistoryLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042401) + } + } + } + + override fun observeRequestState() { + fileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + versionHistoryLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getApkVersionListByPage() + } + + versionHistoryLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getApkVersionListByPage() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getApkVersionListByPage() + } + + private fun getApkVersionListByPage() { + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023042401 -> { + if (isRefresh || isLoadMore) { + versionHistoryAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("无APP版本更新记录") { + pageIndex = 1 + getApkVersionListByPage() + } + } else { + emptyView.hide() + versionHistoryAdapter = object : + NormalRecyclerAdapter( + R.layout.item_update_log_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: VersionResultModel.DataModel.RowsModel + ) { + viewHolder.setText( + R.id.versionNameView, + "${resources.getString(R.string.app_name)} ${item.versionName} 主要更新" + ) + .setText(R.id.descriptionView, item.descn) + //2023-04-23T17:06:06 + .setText(R.id.dateView, item.updateTime.split("T")[0]) + } + } + versionHistoryRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + versionHistoryRecyclerView.adapter = versionHistoryAdapter + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt index a4d78eb..348183f 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt @@ -41,9 +41,13 @@ it.printStackTrace() }) - fun updateVersion() = launch({ + fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.updateVersion() + val response = RetrofitServiceManager.getApkVersionList( + fileName, downloadNo, moduleName, ids, offset + ) val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml index c800091..ebb7bc3 100644 --- a/app/src/main/res/drawable/download_progress.xml +++ b/app/src/main/res/drawable/download_progress.xml @@ -3,8 +3,8 @@ - - + + @@ -12,8 +12,8 @@ - - + + diff --git a/app/src/main/res/layout/activity_version_history.xml b/app/src/main/res/layout/activity_version_history.xml new file mode 100644 index 0000000..109340f --- /dev/null +++ b/app/src/main/res/layout/activity_version_history.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3e24281..9efc1f6 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + @@ -100,6 +101,7 @@ + rows; + private int total; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public static class RowsModel { + private String businessDownloadType; + private String businessDownloadTypeName; + private String createTime; + private String createUser; + private String descn; + private String downloadNo; + private String fileName; + private String fileType; + private String fileTypeName; + private String id; + private String minioFileName; + private String moduleName; + private String updateTime; + private String updateUser; + private String versionName; + + public String getBusinessDownloadType() { + return businessDownloadType; + } + + public void setBusinessDownloadType(String businessDownloadType) { + this.businessDownloadType = businessDownloadType; + } + + public String getBusinessDownloadTypeName() { + return businessDownloadTypeName; + } + + public void setBusinessDownloadTypeName(String businessDownloadTypeName) { + this.businessDownloadTypeName = businessDownloadTypeName; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getDescn() { + return descn; + } + + public void setDescn(String descn) { + this.descn = descn; + } + + public String getDownloadNo() { + return downloadNo; + } + + public void setDownloadNo(String downloadNo) { + this.downloadNo = downloadNo; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileTypeName() { + return fileTypeName; + } + + public void setFileTypeName(String fileTypeName) { + this.fileTypeName = fileTypeName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMinioFileName() { + return minioFileName; + } + + public void setMinioFileName(String minioFileName) { + this.minioFileName = minioFileName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getUpdateUser() { + return updateUser; + } + + public void setUpdateUser(String updateUser) { + this.updateUser = updateUser; + } + + public String getVersionName() { + return versionName; + } + + public void setVersionName(String versionName) { + this.versionName = versionName; + } + } + } } diff --git a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt index b31efe0..dbf1293 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/LocaleConstant.kt @@ -67,6 +67,7 @@ const val USER_ID = "userId" const val PRIVACY_CHECK_BOX = "privacyCheckBox" const val PUSH_SETTING = "pushSetting" + const val APP_AUTHORITY = "com.casic.xz.meterage.fileprovider" const val METERAGE_TRAIN_FORM_ID = "jlglpxjhsp" const val STANDARD_FILE_FORM_ID = "jlglwjsp" const val CERTIFICATE_REPORT_FORM_ID = "ywglzsbg" diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3bfa998..005966d 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -91,10 +91,15 @@ ): String /** - * 更新APK版本 + * 获取APK版本列表 */ - @POST("/sys/app/checkVersion") - suspend fun updateVersion(@Header("token") token: String): String + @POST("/download/center/listPage") + suspend fun getApkVersionList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String /** * 获取通知公告列表 diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index b971370..5e355d6 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -215,8 +215,24 @@ /** * 更新APK版本 */ - suspend fun updateVersion(): String { - return api.updateVersion(AuthenticationHelper.token!!) + suspend fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ): String { + val param = JsonObject() + param.addProperty("fileName", fileName) + param.addProperty("downloadNo", downloadNo) + param.addProperty("moduleName", moduleName) + param.add("ids", gson.toJsonTree(ids, typeToken).asJsonArray) + + val requestBody = param.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getApkVersionList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) } /** diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt index d6ef778..7230b80 100644 --- a/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionControlActivity.kt @@ -1,21 +1,34 @@ package com.casic.xz.meterage.view import android.app.ProgressDialog +import android.content.Intent +import android.net.Uri +import android.os.Build +import android.util.Log import android.view.View +import androidx.core.content.FileProvider import androidx.lifecycle.ViewModelProvider import com.casic.xz.meterage.BuildConfig import com.casic.xz.meterage.R import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.appendDownloadUrl import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LocaleConstant import com.casic.xz.meterage.vm.FileViewModel import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.callback.OnDownloadListener +import com.pengxh.kt.lite.extensions.createDownloadFileDir +import com.pengxh.kt.lite.extensions.downloadFile import com.pengxh.kt.lite.extensions.navigatePageTo import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.widget.dialog.AlertControlDialog import kotlinx.android.synthetic.main.activity_version_control.* import kotlinx.android.synthetic.main.include_base_title.* +import java.io.File class VersionControlActivity : ApplicationBaseActivity() { + private val kTag = "VersionControlActivity" private lateinit var fileViewModel: FileViewModel private lateinit var progressDialog: ProgressDialog @@ -39,26 +52,31 @@ fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] fileViewModel.versionResult.observe(this) { -// if (BuildConfig.VERSION_NAME == it.version) { -// "已是最新版本,无需更新".show(this) -// } else { -// AlertControlDialog.Builder() -// .setContext(this) -// .setTitle("提示") -// .setMessage("有新版本,是否更新?") -// .setNegativeButton("稍后再说") -// .setPositiveButton("立即下载") -// .setOnDialogButtonClickListener(object : -// AlertControlDialog.OnDialogButtonClickListener { -// override fun onConfirmClick() { -// downloadApk(it.downloadUrl) -// } -// -// override fun onCancelClick() { -// -// } -// }).build().show() -// } + if (it.code == 200) { + //后台已经倒序,取第一个即可 + val first = it.data.rows.first() + + if (BuildConfig.VERSION_NAME == first.versionName) { + "已是最新版本,无需更新".show(this) + } else { + AlertControlDialog.Builder() + .setContext(this) + .setTitle("提示") + .setMessage("有新版本,是否更新?") + .setNegativeButton("稍后再说") + .setPositiveButton("立即下载") + .setOnDialogButtonClickListener(object : + AlertControlDialog.OnDialogButtonClickListener { + override fun onConfirmClick() { + downloadApk(first.minioFileName) + } + + override fun onCancelClick() { + + } + }).build().show() + } + } } } @@ -70,16 +88,72 @@ leftBackView.setOnClickListener { finish() } introduceLayout.setOnClickListener { - "未实现".show(this) + navigatePageTo() } updateLayout.setOnClickListener { -// fileViewModel.updateVersion() - "未实现".show(this) + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), 1) } privacyView.setOnClickListener { navigatePageTo() } } + + private fun downloadApk(url: String?) { + progressDialog.setMessage("下载新版本中...") + progressDialog + progressDialog.show() + if (url.toString().isBlank()) { + "抱歉,版本下载失败".show(this) + return + } + /** + * http://111.198.10.15:21408/test/202301121601_1682236842001.apk + * */ + val downloadPath = url!!.appendDownloadUrl() + Log.d(kTag, "downloadApk => $downloadPath") + //开始下载 + downloadPath.downloadFile( + this.createDownloadFileDir().toString(), object : OnDownloadListener { + override fun onDownloadStart(totalBytes: Long) { + progressDialog.max = totalBytes.toInt() + } + + override fun onProgressChanged(currentBytes: Long) { + progressDialog.progress = currentBytes.toInt() + } + + override fun onDownloadEnd(file: File?) { + progressDialog.dismiss() + progressDialog.progress = 0 + //安装APK + installApk(file) + } + } + ) + } + + private fun installApk(apkPackage: File?) { + if (apkPackage == null) { + "安装文件异常,无法安装".show(this) + return + } + val intent = Intent(Intent.ACTION_VIEW) + val data: Uri + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //判断版本大于等于7.0 + data = FileProvider.getUriForFile( + this, LocaleConstant.APP_AUTHORITY, apkPackage + ) + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 给目标应用一个临时授权 + } else { + data = Uri.fromFile(apkPackage) + } + /** + * android 10 + * content://com.casic.app.smartwell.fileprovider/smartWell/Download/1.0.1.apk + * */ + intent.setDataAndType(data, "application/vnd.android.package-archive") + startActivity(intent) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt new file mode 100644 index 0000000..bc519cd --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/VersionHistoryActivity.kt @@ -0,0 +1,148 @@ +package com.casic.xz.meterage.view + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.base.ApplicationBaseActivity +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.VersionResultModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.FileViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.adapter.NormalRecyclerAdapter +import com.pengxh.kt.lite.adapter.ViewHolder +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_version_history.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class VersionHistoryActivity : ApplicationBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var fileViewModel: FileViewModel + private lateinit var versionHistoryAdapter: NormalRecyclerAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initLayoutView(): Int = R.layout.activity_version_history + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "功能介绍" + } + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + fileViewModel = ViewModelProvider(this)[FileViewModel::class.java] + fileViewModel.versionResult.observe(this) { + if (it.code == 200) { + val dataRows = it.data?.rows!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + versionHistoryLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + versionHistoryLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023042401) + } + } + } + + override fun observeRequestState() { + fileViewModel.loadState.observe(this) { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + } + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + versionHistoryLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getApkVersionListByPage() + } + + versionHistoryLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getApkVersionListByPage() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getApkVersionListByPage() + } + + private fun getApkVersionListByPage() { + fileViewModel.getApkVersionList("", "", "APP", arrayOf(), pageIndex) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023042401 -> { + if (isRefresh || isLoadMore) { + versionHistoryAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView.showEmptyPage("无APP版本更新记录") { + pageIndex = 1 + getApkVersionListByPage() + } + } else { + emptyView.hide() + versionHistoryAdapter = object : + NormalRecyclerAdapter( + R.layout.item_update_log_rv_l, dataBeans + ) { + override fun convertView( + viewHolder: ViewHolder, + position: Int, + item: VersionResultModel.DataModel.RowsModel + ) { + viewHolder.setText( + R.id.versionNameView, + "${resources.getString(R.string.app_name)} ${item.versionName} 主要更新" + ) + .setText(R.id.descriptionView, item.descn) + //2023-04-23T17:06:06 + .setText(R.id.dateView, item.updateTime.split("T")[0]) + } + } + versionHistoryRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + versionHistoryRecyclerView.adapter = versionHistoryAdapter + } + } + } + } + true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt index a4d78eb..348183f 100644 --- a/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt +++ b/app/src/main/java/com/casic/xz/meterage/vm/FileViewModel.kt @@ -41,9 +41,13 @@ it.printStackTrace() }) - fun updateVersion() = launch({ + fun getApkVersionList( + fileName: String, downloadNo: String, moduleName: String, ids: Array, offset: Int + ) = launch({ loadState.value = LoadState.Loading - val response = RetrofitServiceManager.updateVersion() + val response = RetrofitServiceManager.getApkVersionList( + fileName, downloadNo, moduleName, ids, offset + ) val responseCode = response.separateResponseCode() if (responseCode == 200) { loadState.value = LoadState.Success diff --git a/app/src/main/res/drawable/download_progress.xml b/app/src/main/res/drawable/download_progress.xml index c800091..ebb7bc3 100644 --- a/app/src/main/res/drawable/download_progress.xml +++ b/app/src/main/res/drawable/download_progress.xml @@ -3,8 +3,8 @@ - - + + @@ -12,8 +12,8 @@ - - + + diff --git a/app/src/main/res/layout/activity_version_history.xml b/app/src/main/res/layout/activity_version_history.xml new file mode 100644 index 0000000..109340f --- /dev/null +++ b/app/src/main/res/layout/activity_version_history.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_update_log_rv_l.xml b/app/src/main/res/layout/item_update_log_rv_l.xml new file mode 100644 index 0000000..91c6dd8 --- /dev/null +++ b/app/src/main/res/layout/item_update_log_rv_l.xml @@ -0,0 +1,34 @@ + + + + + + + + + \ No newline at end of file