diff --git a/app/build.gradle b/app/build.gradle
index 340e332..b5ad31e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,4 +102,6 @@
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //HTML解析
+ implementation 'org.jsoup:jsoup:1.15.3'
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 340e332..b5ad31e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,4 +102,6 @@
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //HTML解析
+ implementation 'org.jsoup:jsoup:1.15.3'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e558914..1c12d51 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -36,5 +37,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 340e332..b5ad31e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,4 +102,6 @@
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //HTML解析
+ implementation 'org.jsoup:jsoup:1.15.3'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e558914..1c12d51 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -36,5 +37,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
new file mode 100644
index 0000000..1cfe7ad
--- /dev/null
+++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
@@ -0,0 +1,14 @@
+package com.casic.app.safetreecontroller.extensions
+
+import org.jsoup.Jsoup
+
+fun String.extractApkFiles(): ArrayList {
+ val apkFiles = ArrayList()
+ val document = Jsoup.parse(this)
+ val links = document.select("a[href$=.apk]")
+ for (link in links) {
+ val apkFileName = link.text()
+ apkFiles.add(apkFileName)
+ }
+ return apkFiles
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 340e332..b5ad31e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,4 +102,6 @@
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //HTML解析
+ implementation 'org.jsoup:jsoup:1.15.3'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e558914..1c12d51 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -36,5 +37,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
new file mode 100644
index 0000000..1cfe7ad
--- /dev/null
+++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
@@ -0,0 +1,14 @@
+package com.casic.app.safetreecontroller.extensions
+
+import org.jsoup.Jsoup
+
+fun String.extractApkFiles(): ArrayList {
+ val apkFiles = ArrayList()
+ val document = Jsoup.parse(this)
+ val links = document.select("a[href$=.apk]")
+ for (link in links) {
+ val apkFileName = link.text()
+ apkFiles.add(apkFileName)
+ }
+ return apkFiles
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
index 11ea965..5579474 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
@@ -1,18 +1,28 @@
package com.casic.app.safetreecontroller.fragments
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
+import androidx.core.content.FileProvider
import com.casic.app.safetreecontroller.BuildConfig
+import com.casic.app.safetreecontroller.R
import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding
+import com.casic.app.safetreecontroller.extensions.extractApkFiles
+import com.casic.app.safetreecontroller.utils.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.createDownloadFileDir
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.FileDownloadManager
+import com.pengxh.kt.lite.utils.HttpRequestKit
+import java.io.File
+
class VersionManageFragment : KotlinBaseFragment() {
- override fun initEvent() {
- binding.updateLayout.setOnClickListener {
- }
- }
+ private val kTag = "VersionManageFragment"
override fun initOnCreate(savedInstanceState: Bundle?) {
binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}"
@@ -31,4 +41,82 @@
override fun setupTopBarLayout() {
}
+
+ override fun initEvent() {
+ binding.updateLayout.setOnClickListener {
+ /**
+ * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk
+ * */
+ HttpRequestKit.Builder().setAuthentication()
+ .setRequestTarget(LocaleConstant.APK_FILES_URL)
+ .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener {
+ override fun onFailure(throwable: Throwable) {
+ "更新失败:${throwable.message}".show(requireContext())
+ }
+
+ override fun onSuccess(result: String) {
+ val files = result.extractApkFiles()
+ if (files.isEmpty()) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk]
+ val lastApk = files.last()
+
+ //判断是否需要下载
+ if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //拼接apk下载地址
+ val url = "${LocaleConstant.APK_FILES_URL}${lastApk}"
+ AlertDialog.Builder(requireContext())
+ .setTitle(getString(R.string.app_name))
+ .setMessage("有新版本,是否更新?")
+ .setIcon(R.mipmap.ic_launcher)
+ .setCancelable(false)
+ .setNegativeButton("稍后再说") { _, _ -> }
+ .setPositiveButton("立即下载") { _, _ ->
+ downloadApk(url)
+ }.create().show()
+ }
+
+ }).build().start()
+ }
+ }
+
+ private fun downloadApk(url: String) {
+ binding.downloadProgressBar.visibility = View.VISIBLE
+ FileDownloadManager.Builder().setDownloadFileSource(url)
+ .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk")
+ .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener {
+ override fun onDownloadEnd(file: File) {
+ binding.downloadProgressBar.visibility = View.GONE
+ //安装APK
+ installApk(file)
+ }
+
+ override fun onFailure(throwable: Throwable) {
+
+ }
+
+ override fun onProgressChanged(progress: Int) {
+ binding.downloadProgressBar.progress = progress
+ }
+
+ }).build().start()
+ }
+
+ private fun installApk(apkFile: File) {
+ val apkUri = FileProvider.getUriForFile(
+ requireContext(), "${requireContext().packageName}.provider", apkFile
+ )
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ requireContext().startActivity(intent)
+ }
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 340e332..b5ad31e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,4 +102,6 @@
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //HTML解析
+ implementation 'org.jsoup:jsoup:1.15.3'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e558914..1c12d51 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -36,5 +37,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
new file mode 100644
index 0000000..1cfe7ad
--- /dev/null
+++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
@@ -0,0 +1,14 @@
+package com.casic.app.safetreecontroller.extensions
+
+import org.jsoup.Jsoup
+
+fun String.extractApkFiles(): ArrayList {
+ val apkFiles = ArrayList()
+ val document = Jsoup.parse(this)
+ val links = document.select("a[href$=.apk]")
+ for (link in links) {
+ val apkFileName = link.text()
+ apkFiles.add(apkFileName)
+ }
+ return apkFiles
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
index 11ea965..5579474 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
@@ -1,18 +1,28 @@
package com.casic.app.safetreecontroller.fragments
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
+import androidx.core.content.FileProvider
import com.casic.app.safetreecontroller.BuildConfig
+import com.casic.app.safetreecontroller.R
import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding
+import com.casic.app.safetreecontroller.extensions.extractApkFiles
+import com.casic.app.safetreecontroller.utils.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.createDownloadFileDir
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.FileDownloadManager
+import com.pengxh.kt.lite.utils.HttpRequestKit
+import java.io.File
+
class VersionManageFragment : KotlinBaseFragment() {
- override fun initEvent() {
- binding.updateLayout.setOnClickListener {
- }
- }
+ private val kTag = "VersionManageFragment"
override fun initOnCreate(savedInstanceState: Bundle?) {
binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}"
@@ -31,4 +41,82 @@
override fun setupTopBarLayout() {
}
+
+ override fun initEvent() {
+ binding.updateLayout.setOnClickListener {
+ /**
+ * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk
+ * */
+ HttpRequestKit.Builder().setAuthentication()
+ .setRequestTarget(LocaleConstant.APK_FILES_URL)
+ .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener {
+ override fun onFailure(throwable: Throwable) {
+ "更新失败:${throwable.message}".show(requireContext())
+ }
+
+ override fun onSuccess(result: String) {
+ val files = result.extractApkFiles()
+ if (files.isEmpty()) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk]
+ val lastApk = files.last()
+
+ //判断是否需要下载
+ if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //拼接apk下载地址
+ val url = "${LocaleConstant.APK_FILES_URL}${lastApk}"
+ AlertDialog.Builder(requireContext())
+ .setTitle(getString(R.string.app_name))
+ .setMessage("有新版本,是否更新?")
+ .setIcon(R.mipmap.ic_launcher)
+ .setCancelable(false)
+ .setNegativeButton("稍后再说") { _, _ -> }
+ .setPositiveButton("立即下载") { _, _ ->
+ downloadApk(url)
+ }.create().show()
+ }
+
+ }).build().start()
+ }
+ }
+
+ private fun downloadApk(url: String) {
+ binding.downloadProgressBar.visibility = View.VISIBLE
+ FileDownloadManager.Builder().setDownloadFileSource(url)
+ .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk")
+ .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener {
+ override fun onDownloadEnd(file: File) {
+ binding.downloadProgressBar.visibility = View.GONE
+ //安装APK
+ installApk(file)
+ }
+
+ override fun onFailure(throwable: Throwable) {
+
+ }
+
+ override fun onProgressChanged(progress: Int) {
+ binding.downloadProgressBar.progress = progress
+ }
+
+ }).build().start()
+ }
+
+ private fun installApk(apkFile: File) {
+ val apkUri = FileProvider.getUriForFile(
+ requireContext(), "${requireContext().packageName}.provider", apkFile
+ )
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ requireContext().startActivity(intent)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
index 353eaad..d8423a1 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
@@ -63,4 +63,9 @@
const val METHANE_DEFAULT_VALUE_KEY = "Key_2"
const val SAFE_TREE_CAMERA_IP_KEY = "Key_3"
const val SAFE_TREE_SOCKET_IP_KEY = "Key_4"
+
+ /**
+ * APK文件列表地址
+ * */
+ const val APK_FILES_URL = "http://apk.smartlog.work/SafetyTree/"
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 340e332..b5ad31e 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -102,4 +102,6 @@
implementation 'com.github.CarGuo.GSYVideoPlayer:gsyVideoPlayer-ex_so:v8.4.0-release-jitpack'
//图表
implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
+ //HTML解析
+ implementation 'org.jsoup:jsoup:1.15.3'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e558914..1c12d51 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,6 +8,7 @@
+
@@ -36,5 +37,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
new file mode 100644
index 0000000..1cfe7ad
--- /dev/null
+++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
@@ -0,0 +1,14 @@
+package com.casic.app.safetreecontroller.extensions
+
+import org.jsoup.Jsoup
+
+fun String.extractApkFiles(): ArrayList {
+ val apkFiles = ArrayList()
+ val document = Jsoup.parse(this)
+ val links = document.select("a[href$=.apk]")
+ for (link in links) {
+ val apkFileName = link.text()
+ apkFiles.add(apkFileName)
+ }
+ return apkFiles
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
index 11ea965..5579474 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
@@ -1,18 +1,28 @@
package com.casic.app.safetreecontroller.fragments
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
+import androidx.core.content.FileProvider
import com.casic.app.safetreecontroller.BuildConfig
+import com.casic.app.safetreecontroller.R
import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding
+import com.casic.app.safetreecontroller.extensions.extractApkFiles
+import com.casic.app.safetreecontroller.utils.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.createDownloadFileDir
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.FileDownloadManager
+import com.pengxh.kt.lite.utils.HttpRequestKit
+import java.io.File
+
class VersionManageFragment : KotlinBaseFragment() {
- override fun initEvent() {
- binding.updateLayout.setOnClickListener {
- }
- }
+ private val kTag = "VersionManageFragment"
override fun initOnCreate(savedInstanceState: Bundle?) {
binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}"
@@ -31,4 +41,82 @@
override fun setupTopBarLayout() {
}
+
+ override fun initEvent() {
+ binding.updateLayout.setOnClickListener {
+ /**
+ * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk
+ * */
+ HttpRequestKit.Builder().setAuthentication()
+ .setRequestTarget(LocaleConstant.APK_FILES_URL)
+ .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener {
+ override fun onFailure(throwable: Throwable) {
+ "更新失败:${throwable.message}".show(requireContext())
+ }
+
+ override fun onSuccess(result: String) {
+ val files = result.extractApkFiles()
+ if (files.isEmpty()) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk]
+ val lastApk = files.last()
+
+ //判断是否需要下载
+ if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //拼接apk下载地址
+ val url = "${LocaleConstant.APK_FILES_URL}${lastApk}"
+ AlertDialog.Builder(requireContext())
+ .setTitle(getString(R.string.app_name))
+ .setMessage("有新版本,是否更新?")
+ .setIcon(R.mipmap.ic_launcher)
+ .setCancelable(false)
+ .setNegativeButton("稍后再说") { _, _ -> }
+ .setPositiveButton("立即下载") { _, _ ->
+ downloadApk(url)
+ }.create().show()
+ }
+
+ }).build().start()
+ }
+ }
+
+ private fun downloadApk(url: String) {
+ binding.downloadProgressBar.visibility = View.VISIBLE
+ FileDownloadManager.Builder().setDownloadFileSource(url)
+ .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk")
+ .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener {
+ override fun onDownloadEnd(file: File) {
+ binding.downloadProgressBar.visibility = View.GONE
+ //安装APK
+ installApk(file)
+ }
+
+ override fun onFailure(throwable: Throwable) {
+
+ }
+
+ override fun onProgressChanged(progress: Int) {
+ binding.downloadProgressBar.progress = progress
+ }
+
+ }).build().start()
+ }
+
+ private fun installApk(apkFile: File) {
+ val apkUri = FileProvider.getUriForFile(
+ requireContext(), "${requireContext().packageName}.provider", apkFile
+ )
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ requireContext().startActivity(intent)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
index 353eaad..d8423a1 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
@@ -63,4 +63,9 @@
const val METHANE_DEFAULT_VALUE_KEY = "Key_2"
const val SAFE_TREE_CAMERA_IP_KEY = "Key_3"
const val SAFE_TREE_SOCKET_IP_KEY = "Key_4"
+
+ /**
+ * APK文件列表地址
+ * */
+ const val APK_FILES_URL = "http://apk.smartlog.work/SafetyTree/"
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_version_manage.xml b/app/src/main/res/layout/fragment_version_manage.xml
index d336a94..f80bb2c 100644
--- a/app/src/main/res/layout/fragment_version_manage.xml
+++ b/app/src/main/res/layout/fragment_version_manage.xml
@@ -52,22 +52,35 @@
android:orientation="vertical"
android:paddingHorizontal="@dimen/dp_20">
-
+ android:layout_height="@dimen/itemLayoutHeight"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+
-
+
+
@@ -36,5 +37,15 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
new file mode 100644
index 0000000..1cfe7ad
--- /dev/null
+++ b/app/src/main/java/com/casic/app/safetreecontroller/extensions/String.kt
@@ -0,0 +1,14 @@
+package com.casic.app.safetreecontroller.extensions
+
+import org.jsoup.Jsoup
+
+fun String.extractApkFiles(): ArrayList {
+ val apkFiles = ArrayList()
+ val document = Jsoup.parse(this)
+ val links = document.select("a[href$=.apk]")
+ for (link in links) {
+ val apkFileName = link.text()
+ apkFiles.add(apkFileName)
+ }
+ return apkFiles
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
index 11ea965..5579474 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/fragments/VersionManageFragment.kt
@@ -1,18 +1,28 @@
package com.casic.app.safetreecontroller.fragments
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
+import android.view.View
import android.view.ViewGroup
+import androidx.appcompat.app.AlertDialog
+import androidx.core.content.FileProvider
import com.casic.app.safetreecontroller.BuildConfig
+import com.casic.app.safetreecontroller.R
import com.casic.app.safetreecontroller.databinding.FragmentVersionManageBinding
+import com.casic.app.safetreecontroller.extensions.extractApkFiles
+import com.casic.app.safetreecontroller.utils.LocaleConstant
import com.pengxh.kt.lite.base.KotlinBaseFragment
+import com.pengxh.kt.lite.extensions.createDownloadFileDir
+import com.pengxh.kt.lite.extensions.show
+import com.pengxh.kt.lite.utils.FileDownloadManager
+import com.pengxh.kt.lite.utils.HttpRequestKit
+import java.io.File
+
class VersionManageFragment : KotlinBaseFragment() {
- override fun initEvent() {
- binding.updateLayout.setOnClickListener {
- }
- }
+ private val kTag = "VersionManageFragment"
override fun initOnCreate(savedInstanceState: Bundle?) {
binding.versionView.text = "Version ${BuildConfig.VERSION_NAME}"
@@ -31,4 +41,82 @@
override fun setupTopBarLayout() {
}
+
+ override fun initEvent() {
+ binding.updateLayout.setOnClickListener {
+ /**
+ * http://apk.smartlog.work/SafetyTree/SafeTreeController_20241114_1.0.0.0.apk
+ * */
+ HttpRequestKit.Builder().setAuthentication()
+ .setRequestTarget(LocaleConstant.APK_FILES_URL)
+ .setOnHttpRequestListener(object : HttpRequestKit.OnHttpRequestListener {
+ override fun onFailure(throwable: Throwable) {
+ "更新失败:${throwable.message}".show(requireContext())
+ }
+
+ override fun onSuccess(result: String) {
+ val files = result.extractApkFiles()
+ if (files.isEmpty()) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //[SafeTreeController_20241114_1.0.0.0.apk, SafeTreeController_20241118_1.0.1.0.apk]
+ val lastApk = files.last()
+
+ //判断是否需要下载
+ if (BuildConfig.VERSION_NAME == lastApk.removePrefix("apk").split("_")[2]) {
+ "已经是最新版本".show(requireContext())
+ return
+ }
+
+ //拼接apk下载地址
+ val url = "${LocaleConstant.APK_FILES_URL}${lastApk}"
+ AlertDialog.Builder(requireContext())
+ .setTitle(getString(R.string.app_name))
+ .setMessage("有新版本,是否更新?")
+ .setIcon(R.mipmap.ic_launcher)
+ .setCancelable(false)
+ .setNegativeButton("稍后再说") { _, _ -> }
+ .setPositiveButton("立即下载") { _, _ ->
+ downloadApk(url)
+ }.create().show()
+ }
+
+ }).build().start()
+ }
+ }
+
+ private fun downloadApk(url: String) {
+ binding.downloadProgressBar.visibility = View.VISIBLE
+ FileDownloadManager.Builder().setDownloadFileSource(url)
+ .setFileSaveDirectory(requireContext().createDownloadFileDir()).setFileSuffix("apk")
+ .setOnFileDownloadListener(object : FileDownloadManager.OnFileDownloadListener {
+ override fun onDownloadEnd(file: File) {
+ binding.downloadProgressBar.visibility = View.GONE
+ //安装APK
+ installApk(file)
+ }
+
+ override fun onFailure(throwable: Throwable) {
+
+ }
+
+ override fun onProgressChanged(progress: Int) {
+ binding.downloadProgressBar.progress = progress
+ }
+
+ }).build().start()
+ }
+
+ private fun installApk(apkFile: File) {
+ val apkUri = FileProvider.getUriForFile(
+ requireContext(), "${requireContext().packageName}.provider", apkFile
+ )
+ val intent = Intent(Intent.ACTION_VIEW)
+ intent.setDataAndType(apkUri, "application/vnd.android.package-archive")
+ intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) // 授予URI读取权限
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ requireContext().startActivity(intent)
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
index 353eaad..d8423a1 100644
--- a/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
+++ b/app/src/main/java/com/casic/app/safetreecontroller/utils/LocaleConstant.kt
@@ -63,4 +63,9 @@
const val METHANE_DEFAULT_VALUE_KEY = "Key_2"
const val SAFE_TREE_CAMERA_IP_KEY = "Key_3"
const val SAFE_TREE_SOCKET_IP_KEY = "Key_4"
+
+ /**
+ * APK文件列表地址
+ * */
+ const val APK_FILES_URL = "http://apk.smartlog.work/SafetyTree/"
}
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_version_manage.xml b/app/src/main/res/layout/fragment_version_manage.xml
index d336a94..f80bb2c 100644
--- a/app/src/main/res/layout/fragment_version_manage.xml
+++ b/app/src/main/res/layout/fragment_version_manage.xml
@@ -52,22 +52,35 @@
android:orientation="vertical"
android:paddingHorizontal="@dimen/dp_20">
-
+ android:layout_height="@dimen/itemLayoutHeight"
+ android:gravity="center_vertical"
+ android:orientation="horizontal">
+
+
-
+
+
+
+